From 61c75c0ffba159c0b62da4d292be8eb7d7a1d575 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Sun, 10 Feb 2019 14:59:39 +0000 Subject: [PATCH] Redecompiled PixTone.cpp Now it's way more accurate. Even makes identical ASM. --- src/GenericLoad.cpp | 260 +++++++++++++++++++++++++++++---- src/PixTone.cpp | 349 +++++++++++++------------------------------- src/PixTone.h | 31 +++- src/Sound.cpp | 48 ++++++ src/Sound.h | 3 + 5 files changed, 414 insertions(+), 277 deletions(-) diff --git a/src/GenericLoad.cpp b/src/GenericLoad.cpp index 0cde4c67..5f1a9bdc 100644 --- a/src/GenericLoad.cpp +++ b/src/GenericLoad.cpp @@ -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; } } diff --git a/src/PixTone.cpp b/src/PixTone.cpp index 46377ffc..12a27c25 100644 --- a/src/PixTone.cpp +++ b/src/PixTone.cpp @@ -1,296 +1,153 @@ -#include -#include -#include -#include -#include -#include - -#include "CommonDefines.h" -#include "Tags.h" #include "PixTone.h" -int8_t gWaveModelTable[6][0x100]; -bool wave_tables_made; +#include +#include +#include -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& 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 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; } diff --git a/src/PixTone.h b/src/PixTone.h index 17ec5e14..99991309 100644 --- a/src/PixTone.h +++ b/src/PixTone.h @@ -1,5 +1,30 @@ #pragma once -#include -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); diff --git a/src/Sound.cpp b/src/Sound.cpp index c881e65f..00a9b052 100644 --- a/src/Sound.cpp +++ b/src/Sound.cpp @@ -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; +} diff --git a/src/Sound.h b/src/Sound.h index 2e78292c..6fffc424 100644 --- a/src/Sound.h +++ b/src/Sound.h @@ -2,6 +2,8 @@ #include #include +#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);