Redecompiled PixTone.cpp
Now it's way more accurate. Even makes identical ASM.
This commit is contained in:
parent
545dcdf18d
commit
61c75c0ffb
5 changed files with 414 additions and 277 deletions
|
@ -3,6 +3,149 @@
|
|||
#include "Sound.h"
|
||||
#include "PixTone.h"
|
||||
|
||||
static const PIXTONEPARAMETER gPtpTable[139] =
|
||||
{
|
||||
{1, 5000, {5, 10.0, 32, 0}, {4, 4.0, 32, 0}, {0, 0.0, 63, 0}, 63, 6, 63, 45, 8, 119, 46},
|
||||
{1, 1000, {0, 4.0, 32, 0}, {3, 1.0, 63, 0}, {0, 0.0, 63, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 10000, {0, 30.0, 32, 0}, {3, 1.0, 32, 0}, {0, 0.0, 63, 0}, 0, 19, 44, 111, 13, 198, 9},
|
||||
{1, 10000, {5, 2.0, 31, 0}, {3, 1.0, 57, 219}, {0, 2.0, 32, 0}, 0, 19, 44, 111, 13, 198, 9},
|
||||
{1, 4000, {5, 0.4, 32, 0}, {3, 1.0, 53, 0}, {0, 0.0, 63, 0}, 12, 19, 63, 111, 21, 198, 18},
|
||||
{1, 1000, {1, 12.0, 32, 0}, {2, 1.0, 63, 0}, {0, 0.0, 63, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 1000, {5, 1.0, 32, 0}, {3, 1.0, 63, 0}, {0, 0.0, 63, 0}, 0, 28, 63, 53, 31, 210, 31},
|
||||
{1, 1000, {1, 5.0, 32, 0}, {3, 1.0, 63, 0}, {0, 0.0, 0, 0}, 63, 64, 63, 128, 31, 255, 0},
|
||||
{1, 3000, {1, 17.0, 34, 0}, {3, 2.0, 40, 0}, {4, 1.0, 31, 0}, 63, 64, 63, 225, 63, 255, 0},
|
||||
{1, 6000, {1, 930.0, 22, 0}, {0, 0.7, 53, 0}, {0, 7.0, 32, 0}, 63, 64, 63, 202, 63, 255, 0},
|
||||
{1, 6000, {1, 918.0, 23, 0}, {0, 0.7, 53, 0}, {0, 7.0, 32, 0}, 63, 64, 63, 202, 63, 255, 0},
|
||||
{1, 10000, {2, 200.0, 32, 0}, {0, 1.0, 51, 0}, {1, 20.0, 31, 0}, 63, 64, 63, 89, 30, 208, 28},
|
||||
{1, 10000, {5, 23.0, 16, 0}, {0, 1.0, 58, 0}, {1, 17.0, 32, 0}, 63, 64, 63, 96, 51, 202, 31},
|
||||
{1, 20000, {2, 100.0, 21, 0}, {0, 1.0, 46, 0}, {1, 40.0, 32, 0}, 63, 64, 63, 128, 63, 162, 0},
|
||||
{1, 20000, {5, 5.0, 21, 0}, {0, 1.0, 51, 0}, {1, 40.0, 32, 0}, 63, 64, 63, 128, 63, 162, 28},
|
||||
{1, 10000, {5, 20.0, 23, 0}, {3, 0.7, 26, 235}, {5, 1.0, 9, 0}, 63, 38, 55, 87, 32, 98, 29},
|
||||
{1, 2000, {1, 20.0, 32, 0}, {3, 2.0, 63, 0}, {4, 1.0, 29, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 15000, {5, 10.0, 32, 0}, {3, 0.7, 26, 235}, {0, 0.0, 63, 0}, 63, 38, 55, 187, 15, 255, 0},
|
||||
{1, 4000, {1, 20.0, 32, 0}, {3, 2.0, 63, 0}, {4, 1.0, 29, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 22000, {5, 6.0, 32, 0}, {3, 0.7, 26, 246}, {0, 0.0, 63, 0}, 63, 38, 55, 187, 15, 255, 0},
|
||||
{1, 8000, {0, 20.0, 32, 0}, {3, 2.0, 63, 0}, {4, 1.0, 29, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 10000, {4, 400.0, 13, 0}, {0, 0.8, 63, 0}, {4, 8.0, 31, 0}, 63, 64, 63, 191, 32, 255, 0},
|
||||
{1, 10000, {4, 800.0, 14, 0}, {0, 0.8, 63, 0}, {4, 8.0, 30, 125}, 63, 64, 63, 128, 63, 166, 0},
|
||||
{1, 5000, {2, 50.0, 39, 0}, {3, 0.5, 40, 217}, {1, 0.0, 32, 0}, 63, 64, 63, 128, 34, 198, 32},
|
||||
{1, 5000, {5, 10.0, 39, 0}, {3, 0.5, 24, 217}, {1, 4.0, 32, 0}, 0, 4, 63, 128, 34, 198, 32},
|
||||
{1, 40000, {5, 10.0, 32, 0}, {3, 1.0, 32, 241}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 40000, {5, 20.0, 32, 0}, {0, 0.0, 32, 0}, {5, 0.1, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 30000, {2, 400.0, 32, 0}, {3, 0.3, 60, 250}, {0, 20.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 10000, {4, 400.0, 13, 0}, {0, 0.8, 63, 0}, {4, 8.0, 50, 0}, 63, 64, 63, 191, 32, 255, 0},
|
||||
{1, 10000, {4, 800.0, 5, 0}, {0, 0.8, 63, 0}, {4, 8.0, 63, 125}, 63, 64, 63, 128, 63, 166, 0},
|
||||
{1, 6000, {3, 123.0, 32, 0}, {4, 1.0, 16, 222}, {4, 4.0, 37, 0}, 0, 6, 63, 104, 25, 255, 0},
|
||||
{1, 4000, {5, 4.5, 32, 0}, {3, 1.0, 46, 102}, {3, 2.5, 47, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 5000, {4, 40.0, 52, 0}, {2, 1.0, 63, 0}, {3, 10.0, 63, 0}, 63, 47, 27, 47, 29, 255, 0},
|
||||
{1, 3000, {0, 99.0, 32, 0}, {2, 1.0, 55, 197}, {5, 0.0, 0, 0}, 63, 0, 63, 164, 28, 255, 0},
|
||||
{1, 10000, {1, 601.0, 32, 0}, {4, 0.5, 15, 235}, {0, 10.0, 54, 0}, 63, 0, 63, 0, 63, 255, 0},
|
||||
{1, 8000, {5, 10.0, 15, 0}, {4, 0.5, 16, 239}, {4, 0.0, 50, 0}, 63, 0, 63, 96, 17, 255, 0},
|
||||
{1, 20000, {1, 832.0, 32, 0}, {2, 1.0, 46, 0}, {0, 27.0, 63, 0}, 63, 0, 63, 140, 10, 255, 0},
|
||||
{1, 20000, {1, 918.0, 32, 0}, {2, 1.0, 46, 0}, {0, 21.0, 63, 0}, 63, 0, 63, 140, 10, 255, 0},
|
||||
{1, 4000, {1, 54.0, 32, 0}, {5, 0.1, 33, 0}, {0, 0.0, 32, 0}, 53, 57, 44, 128, 24, 255, 0},
|
||||
{1, 10000, {1, 246.0, 23, 0}, {4, 0.6, 22, 239}, {4, 6.0, 63, 0}, 0, 11, 63, 13, 63, 255, 0},
|
||||
{1, 10000, {1, 294.0, 23, 0}, {4, 0.6, 22, 247}, {4, 6.0, 63, 140}, 0, 15, 63, 17, 63, 255, 0},
|
||||
{1, 22050, {0, 117.0, 63, 0}, {5, 2.0, 18, 0}, {5, 0.0, 0, 0}, 63, 0, 63, 64, 19, 255, 0},
|
||||
{1, 5000, {0, 28.0, 32, 0}, {3, 3.0, 27, 0}, {5, 0.0, 0, 0}, 63, 0, 63, 0, 63, 255, 0},
|
||||
{1, 10000, {0, 322.0, 32, 0}, {2, 8.0, 37, 0}, {2, 0.0, 0, 0}, 0, 13, 63, 106, 11, 255, 0},
|
||||
{1, 10000, {5, 7.3, 32, 0}, {5, 0.2, 29, 0}, {0, 0.0, 32, 0}, 63, 91, 63, 149, 25, 255, 0},
|
||||
{1, 1000, {0, 6.0, 32, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 20000, {2, 186.0, 32, 0}, {0, 4.0, 13, 98}, {3, 4.0, 5, 0}, 63, 64, 28, 255, 0, 255, 0},
|
||||
{1, 20000, {2, 285.0, 19, 0}, {3, 4.0, 21, 0}, {3, 4.0, 33, 130}, 63, 64, 63, 255, 0, 255, 0},
|
||||
{1, 10000, {0, 970.0, 32, 0}, {2, 1.0, 35, 195}, {0, 31.0, 31, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 20000, {5, 6.0, 32, 0}, {3, 1.0, 54, 239}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 35},
|
||||
{1, 40000, {5, 4.0, 32, 0}, {3, 0.0, 32, 230}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 40000, {1, 238.0, 32, 0}, {3, 1.0, 14, 0}, {4, 30.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 3000, {2, 62.0, 32, 0}, {2, 3.0, 63, 0}, {3, 3.0, 14, 0}, 63, 0, 63, 210, 32, 255, 0},
|
||||
{1, 5000, {2, 58.0, 32, 0}, {2, 3.0, 63, 0}, {2, 3.0, 32, 0}, 63, 0, 63, 49, 27, 255, 0},
|
||||
{1, 3000, {0, 13.0, 24, 0}, {3, 2.0, 40, 0}, {4, 1.0, 31, 0}, 63, 64, 63, 225, 63, 255, 0},
|
||||
{1, 3000, {5, 6.0, 32, 0}, {5, 1.0, 32, 0}, {3, 0.0, 0, 0}, 0, 0, 63, 45, 23, 255, 0},
|
||||
{1, 20000, {1, 477.0, 40, 0}, {5, 93.0, 39, 0}, {4, 17.0, 19, 0}, 0, 64, 63, 128, 63, 255, 0},
|
||||
{1, 6000, {5, 11.0, 32, 0}, {5, 1.0, 32, 0}, {3, 3.0, 32, 0}, 63, 0, 63, 0, 63, 255, 0},
|
||||
{1, 6000, {1, 329.0, 20, 0}, {2, 2.0, 47, 77}, {3, 3.0, 63, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 8000, {4, 2000.0, 32, 0}, {2, 1.0, 0, 0}, {0, 0.0, 32, 0}, 43, 21, 7, 255, 0, 255, 0},
|
||||
{1, 5000, {1, 231.0, 32, 0}, {4, 1.0, 32, 65}, {3, 2.0, 32, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 3000, {0, 107.0, 32, 0}, {4, 1.0, 15, 0}, {0, 0.0, 17, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 20000, {5, 4.0, 32, 0}, {5, 1.0, 32, 170}, {5, 0.0, 32, 0}, 63, 38, 22, 255, 0, 255, 0},
|
||||
{1, 5000, {1, 16.0, 32, 0}, {3, 1.0, 32, 238}, {0, 0.0, 0, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 20000, {5, 4.0, 32, 0}, {0, 0.7, 61, 43}, {3, 1.0, 22, 224}, 63, 64, 63, 204, 46, 255, 0},
|
||||
{1, 5000, {0, 880.0, 19, 0}, {0, 0.0, 32, 0}, {0, 8.0, 32, 0}, 0, 11, 63, 34, 25, 255, 0},
|
||||
{1, 2000, {5, 3.0, 16, 0}, {3, 2.0, 12, 0}, {3, 1.0, 37, 0}, 0, 51, 63, 132, 24, 255, 0},
|
||||
{1, 22050, {1, 400.0, 32, 0}, {0, 20.0, 10, 0}, {3, 10.0, 8, 0}, 0, 6, 63, 60, 21, 255, 0},
|
||||
{1, 2000, {5, 2.0, 32, 0}, {2, 3.0, 54, 0}, {0, 0.0, 32, 0}, 0, 17, 63, 98, 22, 255, 0},
|
||||
{1, 8000, {1, 814.0, 32, 0}, {2, 11.0, 32, 0}, {3, 16.0, 32, 0}, 63, 23, 63, 74, 12, 255, 0},
|
||||
{1, 10000, {5, 21.0, 21, 0}, {0, 5.0, 32, 178}, {0, 3.0, 33, 181}, 63, 38, 63, 104, 20, 255, 0},
|
||||
{1, 6000, {5, 1.0, 28, 0}, {3, 6.0, 56, 0}, {0, 8.0, 32, 0}, 63, 57, 63, 98, 20, 255, 0},
|
||||
{1, 4000, {5, 6.0, 32, 0}, {3, 2.0, 32, 0}, {3, 2.0, 32, 0}, 63, 26, 30, 66, 29, 255, 0},
|
||||
{1, 22050, {5, 711.0, 32, 0}, {5, 7.0, 32, 0}, {0, 0.0, 32, 0}, 0, 13, 0, 17, 63, 255, 0},
|
||||
{1, 2000, {5, 2.0, 32, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 62050, {5, 40.0, 32, 0}, {5, 1.0, 32, 0}, {5, 0.0, 0, 0}, 0, 17, 63, 36, 63, 255, 0},
|
||||
{1, 8000, {0, 77.0, 32, 0}, {3, 3.0, 56, 189}, {0, 0.0, 17, 0}, 0, 38, 63, 140, 28, 255, 0},
|
||||
{1, 8000, {5, 8.0, 32, 0}, {3, 3.0, 54, 189}, {3, 3.0, 32, 0}, 63, 38, 42, 140, 21, 255, 0},
|
||||
{1, 9050, {5, 9.0, 26, 0}, {0, 1.0, 32, 209}, {0, 0.0, 32, 0}, 63, 64, 63, 132, 63, 255, 0},
|
||||
{1, 9050, {2, 43.0, 32, 0}, {3, 1.0, 47, 172}, {0, 0.0, 32, 0}, 63, 64, 63, 198, 63, 255, 0},
|
||||
{1, 22050, {1, 754.0, 32, 0}, {2, 0.5, 14, 126}, {4, 18.0, 17, 0}, 0, 64, 63, 128, 63, 255, 0},
|
||||
{1, 22050, {0, 597.0, 12, 0}, {2, 0.5, 14, 126}, {4, 18.0, 17, 0}, 0, 64, 40, 128, 41, 255, 0},
|
||||
{1, 6000, {2, 217.0, 32, 0}, {0, 0.7, 16, 0}, {3, 0.0, 32, 0}, 0, 32, 63, 49, 15, 255, 0},
|
||||
{1, 5000, {5, 1.0, 32, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 0, 64, 63, 81, 28, 255, 0},
|
||||
{1, 10000, {5, 11.0, 32, 0}, {2, 4.0, 32, 0}, {0, 3.0, 32, 0}, 0, 64, 63, 128, 30, 255, 0},
|
||||
{1, 10000, {5, 1.0, 32, 0}, {4, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 32, 128, 33, 255, 0},
|
||||
{1, 10000, {2, 168.0, 32, 0}, {0, 0.5, 29, 173}, {0, 0.0, 32, 0}, 0, 13, 63, 68, 35, 255, 0},
|
||||
{1, 10000, {2, 50.0, 32, 0}, {0, 0.5, 29, 173}, {2, 100.0, 32, 0}, 0, 13, 63, 68, 35, 255, 0},
|
||||
{1, 4000, {5, 11.0, 25, 0}, {3, 3.0, 32, 0}, {0, 0.0, 32, 0}, 0, 9, 63, 128, 14, 255, 0},
|
||||
{1, 4000, {5, 3.0, 27, 0}, {3, 3.0, 32, 0}, {0, 0.0, 32, 0}, 0, 9, 63, 128, 14, 255, 0},
|
||||
{1, 3000, {4, 9.0, 20, 0}, {3, 3.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 3000, {4, 18.0, 20, 0}, {3, 3.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 0},
|
||||
{1, 3000, {5, 4.0, 32, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 0, 64, 63, 128, 63, 255, 0},
|
||||
{1, 12000, {5, 2.0, 32, 0}, {3, 1.7, 53, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 162, 25, 255, 0},
|
||||
{1, 12000, {3, 77.0, 32, 0}, {3, 1.0, 61, 200}, {0, 19.0, 22, 0}, 63, 64, 63, 172, 25, 255, 0},
|
||||
{1, 5000, {0, 16.0, 63, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 166, 35, 255, 0},
|
||||
{1, 1000, {5, 1.0, 16, 0}, {0, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 91, 28, 255, 0},
|
||||
{1, 5000, {0, 20.0, 30, 0}, {3, 1.0, 44, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 111, 19, 255, 0},
|
||||
{1, 10000, {5, 14.0, 41, 0}, {5, 3.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 18, 91, 12, 255, 0},
|
||||
{1, 1000, {5, 48.0, 30, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 166, 27, 255, 0},
|
||||
{1, 10000, {5, 48.0, 30, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 43, 166, 41, 255, 7},
|
||||
{1, 4000, {5, 35.0, 30, 0}, {3, 35.0, 32, 0}, {0, 0.0, 32, 0}, 63, 53, 21, 166, 13, 255, 0},
|
||||
{1, 10000, {1, 63.0, 32, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 39, 91, 20, 255, 0},
|
||||
{1, 22050, {5, 52.0, 22, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 3, 23, 23, 57, 10, 255, 0},
|
||||
{1, 22050, {5, 80.0, 22, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 23, 23, 57, 10, 255, 0},
|
||||
{1, 44100, {5, 54.0, 12, 0}, {5, 1.0, 32, 0}, {5, 1.0, 27, 0}, 40, 64, 63, 128, 38, 255, 63},
|
||||
{1, 44100, {5, 119.0, 9, 0}, {5, 2.0, 32, 0}, {0, 0.0, 32, 0}, 61, 64, 39, 128, 60, 255, 28},
|
||||
{1, 4000, {5, 11.0, 32, 0}, {5, 1.0, 17, 197}, {0, 0.0, 32, 0}, 51, 100, 63, 100, 0, 255, 0},
|
||||
{1, 4000, {5, 21.0, 32, 0}, {5, 1.0, 17, 197}, {0, 0.0, 32, 0}, 0, 119, 0, 117, 63, 255, 0},
|
||||
{1, 5000, {2, 143.0, 25, 0}, {3, 0.5, 40, 217}, {1, 0.0, 32, 0}, 63, 64, 63, 128, 34, 198, 32},
|
||||
{1, 5000, {5, 10.0, 23, 0}, {3, 0.5, 24, 217}, {1, 4.0, 32, 0}, 0, 4, 63, 128, 34, 198, 32},
|
||||
{1, 4000, {5, 6.0, 32, 0}, {3, 2.0, 32, 0}, {3, 2.0, 32, 0}, 63, 26, 30, 66, 29, 255, 0},
|
||||
{1, 4000, {0, 150.0, 32, 0}, {0, 0.0, 32, 0}, {3, 2.0, 32, 0}, 63, 26, 30, 66, 29, 255, 0},
|
||||
{1, 40050, {4, 100.0, 32, 0}, {3, 8.0, 22, 0}, {3, 8.0, 8, 0}, 63, 28, 44, 81, 23, 255, 0},
|
||||
{1, 40050, {4, 150.0, 32, 0}, {3, 8.0, 22, 0}, {3, 8.0, 8, 0}, 63, 28, 44, 81, 23, 255, 0},
|
||||
{1, 40050, {4, 294.0, 32, 0}, {3, 8.0, 22, 0}, {3, 8.0, 8, 0}, 63, 28, 44, 81, 23, 255, 0},
|
||||
{1, 5000, {3, 621.0, 32, 0}, {2, 2.0, 22, 0}, {3, 6.0, 32, 0}, 0, 4, 63, 77, 30, 255, 0},
|
||||
{1, 30000, {5, 28.0, 44, 0}, {3, 1.0, 45, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 208, 63, 255, 0},
|
||||
{1, 30000, {2, 101.0, 44, 0}, {2, 0.5, 63, 118}, {0, 0.0, 32, 0}, 63, 64, 63, 176, 63, 255, 0},
|
||||
{1, 30000, {2, 86.0, 44, 0}, {2, 0.5, 63, 118}, {0, 0.0, 32, 0}, 63, 64, 63, 176, 63, 255, 0},
|
||||
{1, 2000, {5, 1.0, 32, 0}, {0, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 2000, {3, 99.0, 12, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 63, 64, 63, 128, 63, 255, 63},
|
||||
{1, 6000, {3, 388.0, 22, 0}, {0, 0.7, 53, 0}, {0, 7.0, 32, 0}, 25, 64, 63, 202, 63, 255, 0},
|
||||
{1, 6000, {1, 918.0, 23, 0}, {0, 0.7, 53, 0}, {0, 7.0, 32, 0}, 63, 64, 63, 202, 63, 255, 0},
|
||||
{1, 10000, {5, 118.0, 19, 0}, {3, 1.0, 63, 0}, {0, 3.0, 32, 0}, 0, 19, 63, 66, 41, 255, 0},
|
||||
{1, 10000, {5, 6.0, 24, 0}, {3, 1.0, 32, 208}, {2, 8.0, 12, 0}, 63, 64, 63, 128, 38, 255, 0},
|
||||
{1, 400, {1, 20.0, 12, 0}, {0, 0.0, 32, 0}, {0, 0.0, 32, 0}, 0, 43, 63, 193, 63, 255, 0},
|
||||
{1, 400, {1, 30.0, 12, 0}, {0, 0.0, 32, 0}, {0, 0.0, 32, 0}, 0, 43, 63, 193, 63, 255, 0},
|
||||
{1, 400, {1, 40.0, 12, 0}, {0, 0.0, 32, 0}, {0, 0.0, 32, 0}, 0, 43, 63, 193, 63, 255, 0},
|
||||
{1, 8000, {3, 800.0, 24, 0}, {0, 8.0, 4, 0}, {0, 0.0, 32, 0}, 0, 13, 63, 138, 63, 255, 0},
|
||||
{1, 8000, {5, 53.0, 12, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 0, 0, 63, 68, 63, 255, 0},
|
||||
{1, 8000, {3, 400.0, 24, 0}, {0, 8.0, 4, 0}, {0, 0.0, 32, 0}, 0, 13, 63, 138, 63, 255, 0},
|
||||
{1, 8000, {5, 53.0, 12, 0}, {5, 1.0, 32, 0}, {0, 0.0, 32, 0}, 0, 0, 63, 68, 63, 255, 0},
|
||||
{1, 8000, {3, 200.0, 32, 0}, {0, 8.0, 4, 0}, {0, 0.0, 32, 0}, 0, 13, 63, 138, 63, 255, 0},
|
||||
{1, 8000, {5, 25.0, 17, 0}, {3, 1.0, 32, 0}, {0, 0.0, 32, 0}, 0, 0, 63, 68, 63, 255, 0},
|
||||
{1, 8000, {4, 800.0, 32, 0}, {4, 2.0, 21, 0}, {4, 8.0, 32, 0}, 0, 106, 63, 130, 27, 255, 0},
|
||||
{1, 3000, {4, 31.0, 10, 0}, {3, 2.0, 40, 0}, {4, 1.0, 31, 0}, 0, 9, 63, 94, 63, 255, 0},
|
||||
{1, 5000, {2, 168.0, 32, 0}, {0, 0.5, 29, 173}, {0, 0.0, 32, 0}, 0, 13, 63, 68, 35, 255, 0},
|
||||
{1, 1000, {0, 20.0, 0, 0}, {0, 0.0, 0, 0}, {0, 0.0, 0, 0}, 0, 64, 0, 128, 0, 255, 0}
|
||||
};
|
||||
|
||||
bool LoadGenericData()
|
||||
{
|
||||
MakeSurface_Resource("PIXEL", 1);
|
||||
|
@ -53,34 +196,95 @@ bool LoadGenericData()
|
|||
MakeSurface_Generic(320, 240, SURFACE_ID_LEVEL_SPRITESET_1);
|
||||
MakeSurface_Generic(320, 240, SURFACE_ID_LEVEL_SPRITESET_2);
|
||||
MakeSurface_Generic(WINDOW_WIDTH, 240, SURFACE_ID_CREDIT_CAST);
|
||||
|
||||
char path[0x100];
|
||||
uint8_t *buf = nullptr;
|
||||
size_t len;
|
||||
|
||||
for (unsigned int n = 0; n < SOUND_NO; n++)
|
||||
{
|
||||
sprintf(path, "%2.2X.pxt", n);
|
||||
|
||||
if (LoadPxt(path, &buf, &len))
|
||||
{
|
||||
lpSECONDARYBUFFER[n] = new SOUNDBUFFER(len);
|
||||
|
||||
uint8_t *sBuf;
|
||||
size_t sLen;
|
||||
lpSECONDARYBUFFER[n]->Lock(&sBuf, &sLen);
|
||||
memcpy(sBuf, buf, sLen);
|
||||
lpSECONDARYBUFFER[n]->Unlock();
|
||||
lpSECONDARYBUFFER[n]->SetFrequency(22050);
|
||||
}
|
||||
|
||||
//Free buffer, we're done with it
|
||||
if (buf)
|
||||
{
|
||||
free(buf);
|
||||
buf = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
size_t pixtone_bytes = MakePixToneObject(&gPtpTable[0], 2, 32);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[2], 2, 33);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[4], 2, 34);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[6], 1, 15);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[7], 1, 24);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[8], 1, 23);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[9], 2, 50);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[11], 2, 51);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[33], 1, 1);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[38], 1, 2);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[56], 1, 29);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[61], 1, 43);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[62], 3, 44);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[65], 1, 45);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[66], 1, 46);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[68], 1, 47);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[49], 3, 35);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[52], 3, 39);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[13], 2, 52);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[28], 2, 53);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[15], 2, 70);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[17], 2, 71);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[19], 2, 72);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[30], 1, 5);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[32], 1, 11);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[35], 1, 4);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[46], 2, 25);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[48], 1, 27);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[54], 2, 28);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[39], 1, 14);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[23], 2, 16);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[25], 3, 17);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[34], 1, 18);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[36], 2, 20);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[31], 1, 22);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[41], 2, 26);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[43], 1, 21);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[44], 2, 12);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[57], 2, 38);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[59], 1, 31);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[60], 1, 42);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[69], 1, 48);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[70], 2, 49);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[72], 1, 100);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[73], 3, 101);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[76], 2, 54);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[78], 2, 102);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[80], 2, 103);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[81], 1, 104);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[82], 1, 105);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[83], 2, 106);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[85], 1, 107);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[86], 1, 30);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[87], 1, 108);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[88], 1, 109);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[89], 1, 110);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[90], 1, 111);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[91], 1, 112);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[92], 1, 113);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[93], 2, 114);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[95], 2, 150);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[97], 2, 151);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[99], 1, 152);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[100], 1, 153);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[101], 2, 154);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[111], 2, 155);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[103], 2, 56);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[105], 2, 40);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[105], 2, 41);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[107], 2, 37);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[109], 2, 57);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[113], 3, 115);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[116], 1, 104);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[117], 3, 116);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[120], 2, 58);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[122], 2, 55);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[124], 2, 117);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[126], 1, 59);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[127], 1, 60);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[128], 1, 61);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[129], 2, 62);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[131], 2, 63);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[133], 2, 64);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[135], 1, 65);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[136], 1, 3);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[137], 1, 6);
|
||||
pixtone_bytes += MakePixToneObject(&gPtpTable[138], 1, 7);
|
||||
// sprintf(&v1, "PixTone = %d byte", pixtone_bytes);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
349
src/PixTone.cpp
349
src/PixTone.cpp
|
@ -1,296 +1,153 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
#include <math.h>
|
||||
|
||||
#include "CommonDefines.h"
|
||||
#include "Tags.h"
|
||||
#include "PixTone.h"
|
||||
|
||||
int8_t gWaveModelTable[6][0x100];
|
||||
bool wave_tables_made;
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void MakeWaveTables()
|
||||
#include "WindowsWrapper.h"
|
||||
|
||||
static char gWaveModelTable[6][256];
|
||||
|
||||
void MakeWaveTables(void)
|
||||
{
|
||||
/* Sine wave */
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
int i, a;
|
||||
|
||||
// Sine wave
|
||||
for (i = 0; i < 256; ++i)
|
||||
{
|
||||
gWaveModelTable[0][i] = (sin(i * 6.283184 / 256.0) * 64.0);
|
||||
|
||||
/* Triangle wave */
|
||||
int triangle = 0;
|
||||
for (int i = 0; i < 0x40; ++i) //Upwards
|
||||
gWaveModelTable[1][i] = (triangle++ << 6) / 0x40;
|
||||
triangle = 0;
|
||||
for (int i = 0x40; i < 0xC0; ++i) //Downwards
|
||||
gWaveModelTable[1][i] = 0x40 - (triangle++ << 6) / 0x40;
|
||||
triangle = 0;
|
||||
for (int i = 0xC0; i < 0x100; ++i) //Back upwards
|
||||
gWaveModelTable[1][i] = (triangle++ << 6) / 0x40 - 0x40;
|
||||
|
||||
/* Saw up wave */
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
a = gWaveModelTable[0][i];
|
||||
}
|
||||
|
||||
// Triangle wave
|
||||
for (a = 0, i = 0; i < 0x40; ++i)
|
||||
{
|
||||
// Upwards
|
||||
gWaveModelTable[1][i] = (a * 0x40) / 0x40;
|
||||
++a;
|
||||
}
|
||||
for (a = 0; i < 0xC0; ++i)
|
||||
{
|
||||
// Downwards
|
||||
gWaveModelTable[1][i] = 0x40 - (a * 0x40) / 0x40;
|
||||
++a;
|
||||
}
|
||||
for (a = 0; i < 0x100; ++i)
|
||||
{
|
||||
// Back up
|
||||
gWaveModelTable[1][i] = (a * 0x40) / 0x40 - 0x40;
|
||||
++a;
|
||||
}
|
||||
|
||||
// Saw up wave
|
||||
for (i = 0; i < 0x100; ++i)
|
||||
gWaveModelTable[2][i] = i / 2 - 0x40;
|
||||
|
||||
/* Saw down wave */
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
// Saw down wave
|
||||
for (i = 0; i < 0x100; ++i)
|
||||
gWaveModelTable[3][i] = 0x40 - i / 2;
|
||||
|
||||
/* Square wave */
|
||||
for (int i = 0; i < 0x80; i++)
|
||||
// Square wave
|
||||
for (i = 0; i < 0x80; ++i)
|
||||
gWaveModelTable[4][i] = 0x40;
|
||||
for (int i = 0x80; i < 0x100; i++)
|
||||
for (; i < 0x100; ++i)
|
||||
gWaveModelTable[4][i] = -0x40;
|
||||
|
||||
/* White noise wave */
|
||||
// White noise wave
|
||||
srand(0);
|
||||
for (int i = 0; i < 0x100; i++)
|
||||
gWaveModelTable[5][i] = (int8_t)rand() / 2;
|
||||
for (i = 0; i < 256; ++i)
|
||||
gWaveModelTable[5][i] = (char)(rand() & 0xFF) / 2;
|
||||
}
|
||||
|
||||
//Loading .pxt files
|
||||
double fgetv(FILE *fp) // Load a numeric value from text file; one per line.
|
||||
BOOL MakePixelWaveData(const PIXTONEPARAMETER *ptp, unsigned char *pData)
|
||||
{
|
||||
//Create buffer
|
||||
char Buf[0x1000];
|
||||
Buf[0xFFF] = '\0';
|
||||
char *p = Buf;
|
||||
|
||||
if (!std::fgets(Buf, sizeof(Buf) - 1, fp))
|
||||
return 0.0;
|
||||
|
||||
// Ignore empty lines. If the line was empty, try next line.
|
||||
if (!Buf[0] || Buf[0] == '\r' || Buf[0] == '\n')
|
||||
return fgetv(fp);
|
||||
|
||||
while (*p && *p++ != ':')
|
||||
{
|
||||
}
|
||||
|
||||
return std::strtod(p, 0); // Parse the value and return it.
|
||||
}
|
||||
// The Linux port added a cute optimisation here, where MakeWaveTables is only called once during the game's execution
|
||||
MakeWaveTables();
|
||||
|
||||
bool MakePixelWaveData(const std::vector<double>& pxtData, uint8_t *data)
|
||||
{
|
||||
//Make wave tables if not created already
|
||||
if (!wave_tables_made)
|
||||
{
|
||||
MakeWaveTables();
|
||||
wave_tables_made = true;
|
||||
}
|
||||
|
||||
//Get some envelope stuff
|
||||
char envelopeTable[0x100];
|
||||
memset(envelopeTable, 0, sizeof(envelopeTable));
|
||||
memset(envelopeTable, 0, 0x100);
|
||||
|
||||
size_t i = 0;
|
||||
int i = 0;
|
||||
double dEnvelope;
|
||||
|
||||
//Point A
|
||||
long double currentEnvelope = pxtData[14];
|
||||
while (i < pxtData[15])
|
||||
dEnvelope = ptp->initial;
|
||||
while (i < ptp->pointAx)
|
||||
{
|
||||
envelopeTable[i] = (char)currentEnvelope;
|
||||
currentEnvelope = (pxtData[16] - pxtData[14])
|
||||
/ pxtData[15]
|
||||
+ currentEnvelope;
|
||||
envelopeTable[i] = dEnvelope;
|
||||
dEnvelope = ((double)ptp->pointAy - ptp->initial) / ptp->pointAx + dEnvelope;
|
||||
++i;
|
||||
}
|
||||
|
||||
//Point B
|
||||
long double currentEnvelopea = pxtData[16];
|
||||
while (i < pxtData[17])
|
||||
dEnvelope = ptp->pointAy;
|
||||
while (i < ptp->pointBx)
|
||||
{
|
||||
envelopeTable[i] = (char)currentEnvelopea;
|
||||
currentEnvelopea = (pxtData[18] - pxtData[16])
|
||||
/ (pxtData[17] - pxtData[15])
|
||||
+ currentEnvelopea;
|
||||
envelopeTable[i] = dEnvelope;
|
||||
dEnvelope = ((double)ptp->pointBy - ptp->pointAy) / (double)(ptp->pointBx - ptp->pointAx) + dEnvelope;
|
||||
++i;
|
||||
}
|
||||
|
||||
//Point C
|
||||
long double currentEnvelopeb = pxtData[18];
|
||||
while (i < pxtData[19])
|
||||
dEnvelope = ptp->pointBy;
|
||||
while (i < ptp->pointCx)
|
||||
{
|
||||
envelopeTable[i] = (char)currentEnvelopeb;
|
||||
currentEnvelopeb = (pxtData[20] - pxtData[18])
|
||||
/ (pxtData[19] - pxtData[17])
|
||||
+ currentEnvelopeb;
|
||||
envelopeTable[i] = dEnvelope;
|
||||
dEnvelope = ((double)ptp->pointCy - ptp->pointBy) / (double)(ptp->pointCx - ptp->pointBx) + dEnvelope;
|
||||
++i;
|
||||
}
|
||||
|
||||
//End
|
||||
long double currentEnvelopec = pxtData[20];
|
||||
while (i < 0x100)
|
||||
dEnvelope = ptp->pointCy;
|
||||
while (i < 256)
|
||||
{
|
||||
envelopeTable[i] = (char)currentEnvelopec;
|
||||
currentEnvelopec = currentEnvelopec
|
||||
- pxtData[20] / (0x100 - pxtData[19]);
|
||||
envelopeTable[i] = dEnvelope;
|
||||
dEnvelope = (double)dEnvelope - ptp->pointCy / (double)(256 - ptp->pointCx);
|
||||
++i;
|
||||
}
|
||||
|
||||
long double pitchOffset = pxtData[9];
|
||||
long double mainOffset = pxtData[5];
|
||||
long double volumeOffset = pxtData[13];
|
||||
double dPitch = ptp->oPitch.offset;
|
||||
double dMain = ptp->oMain.offset;
|
||||
double dVolume = ptp->oVolume.offset;
|
||||
|
||||
//Main
|
||||
long double mainFreq;
|
||||
if (pxtData[3] == 0.0)
|
||||
mainFreq = 0.0;
|
||||
double d1;
|
||||
double d2;
|
||||
double d3;
|
||||
|
||||
if (ptp->oMain.num == 0.0)
|
||||
d1 = 0.0;
|
||||
else
|
||||
mainFreq = 256.0 / (pxtData[1] / pxtData[3]);
|
||||
d1 = 256.0 / (ptp->size / ptp->oMain.num);
|
||||
|
||||
//Pitch
|
||||
long double pitchFreq;
|
||||
if (pxtData[7] == 0.0)
|
||||
pitchFreq = 0.0;
|
||||
if (ptp->oPitch.num == 0.0)
|
||||
d2 = 0.0;
|
||||
else
|
||||
pitchFreq = 256.0 / (pxtData[1] / pxtData[7]);
|
||||
d2 = 256.0 / (ptp->size / ptp->oPitch.num);
|
||||
|
||||
//Volume
|
||||
long double volumeFreq;
|
||||
if (pxtData[11] == 0.0)
|
||||
volumeFreq = 0.0;
|
||||
if (ptp->oVolume.num == 0.0)
|
||||
d3 = 0.0;
|
||||
else
|
||||
volumeFreq = 256.0 / (pxtData[1] / pxtData[11]);
|
||||
d3 = 256.0 / (ptp->size / ptp->oVolume.num);
|
||||
|
||||
for (i = 0; i < pxtData[1]; ++i)
|
||||
for (i = 0; i < ptp->size; ++i)
|
||||
{
|
||||
const int a = (int)(uint64_t)mainOffset % 256;
|
||||
const int v2 = (int)(uint64_t)pitchOffset % 256;
|
||||
const int a = (int)dMain % 256;
|
||||
const int b = (int)dPitch % 256;
|
||||
const int c = (int)dVolume % 256;
|
||||
const int d = (double)(i * 0x100) / ptp->size;
|
||||
pData[i] = gWaveModelTable[ptp->oMain.model][a]
|
||||
* ptp->oMain.top
|
||||
/ 64
|
||||
* (gWaveModelTable[ptp->oVolume.model][c] * ptp->oVolume.top / 64 + 64)
|
||||
/ 64
|
||||
* envelopeTable[d]
|
||||
/ 64
|
||||
+ 128;
|
||||
|
||||
//Input data
|
||||
data[i] = envelopeTable[(uint64_t)((long double)(i << 8) / pxtData[1])]
|
||||
* (pxtData[4]
|
||||
* gWaveModelTable[(size_t)pxtData[2]][a]
|
||||
/ 0x40
|
||||
* (pxtData[12]
|
||||
* gWaveModelTable[(size_t)pxtData[10]][(signed int)(uint64_t)volumeOffset % 0x100]
|
||||
/ 0x40
|
||||
+ 0x40)
|
||||
/ 0x40)
|
||||
/ 0x40
|
||||
+ 0x80;
|
||||
|
||||
long double newMainOffset;
|
||||
if (gWaveModelTable[(size_t)pxtData[6]][v2] >= 0)
|
||||
newMainOffset = (mainFreq * 2)
|
||||
* (long double)gWaveModelTable[(size_t)pxtData[6]][(signed int)(uint64_t)pitchOffset % 256]
|
||||
* pxtData[8]
|
||||
/ 64.0
|
||||
/ 64.0
|
||||
+ mainFreq
|
||||
+ mainOffset;
|
||||
if (gWaveModelTable[ptp->oPitch.model][b] < 0)
|
||||
dMain = d1 - d1 * 0.5 * -gWaveModelTable[ptp->oPitch.model][b] * ptp->oPitch.top / 64.0 / 64.0 + dMain;
|
||||
else
|
||||
newMainOffset = mainFreq
|
||||
- mainFreq
|
||||
* 0.5
|
||||
* (long double)-gWaveModelTable[(size_t)pxtData[6]][v2]
|
||||
* pxtData[8]
|
||||
/ 64.0
|
||||
/ 64.0
|
||||
+ mainOffset;
|
||||
dMain = d1 + d1 * 2.0 * gWaveModelTable[ptp->oPitch.model][b] * ptp->oPitch.top / 64.0 / 64.0 + dMain;
|
||||
|
||||
mainOffset = newMainOffset;
|
||||
pitchOffset = pitchOffset + pitchFreq;
|
||||
volumeOffset = volumeOffset + volumeFreq;
|
||||
dPitch = dPitch + d2;
|
||||
dVolume = dVolume + d3;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoadPxt(char *name, uint8_t **buf, size_t *length)
|
||||
{
|
||||
//Open file
|
||||
char path[PATH_LENGTH];
|
||||
sprintf(path, "%s/Sound/%s", gDataPath, name);
|
||||
FILE *fp = fopen(path, "rb");
|
||||
|
||||
if (!fp)
|
||||
return false;
|
||||
|
||||
//Read data
|
||||
std::vector<double> lineNumbers[4];
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
for (int j = 0; j < 21; j++)
|
||||
{
|
||||
double val = fgetv(fp);
|
||||
lineNumbers[i].push_back(val);
|
||||
}
|
||||
}
|
||||
|
||||
//Close file
|
||||
fclose(fp);
|
||||
|
||||
//Get size
|
||||
size_t size = 0;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (lineNumbers[i][1] > size)
|
||||
size = (size_t)lineNumbers[i][1];
|
||||
}
|
||||
|
||||
//Allocate buffers
|
||||
uint8_t *dest = (uint8_t*)malloc(size);
|
||||
uint8_t *pBlock = (uint8_t*)malloc(size);
|
||||
|
||||
if (dest && pBlock)
|
||||
{
|
||||
//Set buffers to default value of 0x80
|
||||
memset(dest, 0x80, size);
|
||||
memset(pBlock, 0x80, size);
|
||||
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
//Get wave data
|
||||
if (!MakePixelWaveData(lineNumbers[i], dest))
|
||||
{
|
||||
printf("MakePixelWaveData failed for %s\n", name);
|
||||
free(dest);
|
||||
free(pBlock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//Put data into buffer
|
||||
for (int j = 0; j < lineNumbers[i][1]; ++j)
|
||||
{
|
||||
if (dest[j] + pBlock[j] - 0x100 >= -0x7F)
|
||||
{
|
||||
if (dest[j] + pBlock[j] - 0x100 <= 0x7F)
|
||||
pBlock[j] += dest[j] - 0x80;
|
||||
else
|
||||
pBlock[j] = (uint8_t)-1;
|
||||
}
|
||||
else
|
||||
{
|
||||
pBlock[j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Put data from buffers into main sound buffer
|
||||
*buf = (uint8_t*)malloc(size);
|
||||
|
||||
if (!*buf)
|
||||
{
|
||||
printf("Failed to allocate buffer for %s\n", name);
|
||||
free(dest);
|
||||
free(pBlock);
|
||||
return false;
|
||||
}
|
||||
|
||||
*length = size;
|
||||
memcpy(*buf, pBlock, size);
|
||||
|
||||
//Free the two buffers
|
||||
free(dest);
|
||||
free(pBlock);
|
||||
return true;
|
||||
}
|
||||
|
||||
printf("Failed to allocate dest or pBlock for %s\n", name);
|
||||
free(dest);
|
||||
free(pBlock);
|
||||
return false;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,30 @@
|
|||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
void MakeWaveTables();
|
||||
bool LoadPxt(char *name, uint8_t **buf, size_t *length);
|
||||
#include "WindowsWrapper.h"
|
||||
|
||||
struct PIXTONEPARAMETER2
|
||||
{
|
||||
int model;
|
||||
double num;
|
||||
int top;
|
||||
int offset;
|
||||
};
|
||||
|
||||
struct PIXTONEPARAMETER
|
||||
{
|
||||
int use;
|
||||
int size;
|
||||
PIXTONEPARAMETER2 oMain;
|
||||
PIXTONEPARAMETER2 oPitch;
|
||||
PIXTONEPARAMETER2 oVolume;
|
||||
int initial;
|
||||
int pointAx;
|
||||
int pointAy;
|
||||
int pointBx;
|
||||
int pointBy;
|
||||
int pointCx;
|
||||
int pointCy;
|
||||
};
|
||||
|
||||
void MakeWaveTables(void);
|
||||
BOOL MakePixelWaveData(const PIXTONEPARAMETER *ptp, unsigned char *pData);
|
||||
|
|
|
@ -294,3 +294,51 @@ void ChangeSoundPan(int no, int32_t pan)
|
|||
if (lpSECONDARYBUFFER[no])
|
||||
lpSECONDARYBUFFER[no]->SetPan(10 * (pan - 256));
|
||||
}
|
||||
|
||||
size_t MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no)
|
||||
{
|
||||
size_t sample_count = 0;
|
||||
for (int i = 0; i < ptp_num; ++i)
|
||||
{
|
||||
if (ptp[i].size > sample_count)
|
||||
sample_count = ptp[i].size;
|
||||
}
|
||||
|
||||
unsigned char *pcm_buffer = (unsigned char*)malloc(sample_count);
|
||||
unsigned char *mixed_pcm_buffer = (unsigned char*)malloc(sample_count);
|
||||
memset(pcm_buffer, 0x80, sample_count);
|
||||
memset(mixed_pcm_buffer, 0x80, sample_count);
|
||||
|
||||
for (int i = 0; i < ptp_num; ++i)
|
||||
{
|
||||
if (!MakePixelWaveData(&ptp[i], pcm_buffer))
|
||||
{
|
||||
free(pcm_buffer);
|
||||
free(mixed_pcm_buffer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int j = 0; j < ptp[i].size; ++j)
|
||||
{
|
||||
if (pcm_buffer[j] + mixed_pcm_buffer[j] - 0x100 < -0x7F)
|
||||
mixed_pcm_buffer[j] = 0;
|
||||
else if (pcm_buffer[j] + mixed_pcm_buffer[j] - 0x100 > 0x7F)
|
||||
mixed_pcm_buffer[j] = -1;
|
||||
else
|
||||
mixed_pcm_buffer[j] += pcm_buffer[j] + -0x80;
|
||||
}
|
||||
}
|
||||
|
||||
lpSECONDARYBUFFER[no] = new SOUNDBUFFER(sample_count);
|
||||
|
||||
unsigned char *buf;
|
||||
lpSECONDARYBUFFER[no]->Lock(&buf, NULL);
|
||||
memcpy(buf, mixed_pcm_buffer, sample_count);
|
||||
lpSECONDARYBUFFER[no]->Unlock();
|
||||
lpSECONDARYBUFFER[no]->SetFrequency(22050);
|
||||
|
||||
free(pcm_buffer);
|
||||
free(mixed_pcm_buffer);
|
||||
|
||||
return sample_count;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "PixTone.h"
|
||||
|
||||
class SOUNDBUFFER
|
||||
{
|
||||
public:
|
||||
|
@ -95,3 +97,4 @@ void PlaySoundObject(int no, int mode);
|
|||
void ChangeSoundFrequency(int no, uint32_t rate);
|
||||
void ChangeSoundVolume(int no, int32_t volume);
|
||||
void ChangeSoundPan(int no, int32_t pan);
|
||||
size_t MakePixToneObject(const PIXTONEPARAMETER *ptp, int ptp_num, int no);
|
||||
|
|
Loading…
Add table
Reference in a new issue