12 using namespace openmsx;
20 static const unsigned CHANNELS = 11;
35 typedef vector<LogEvent>
Log;
39 static void error(
const string& message)
41 cout << message << endl;
45 static void saveWav(
const string& filename,
const Samples& data)
48 writer.write16mono(&data[0], data.size());
51 static void loadWav(
const string& filename,
Samples& data)
54 assert(wav.getFreq() == 3579545 / 72);
55 assert(wav.getBits() == 16);
56 assert(wav.getChannels() == 1);
58 auto rawData =
reinterpret_cast<const short*
>(wav.getData());
59 data.assign(rawData, rawData + wav.getSize());
62 static void loadWav(
Samples& data)
65 loadWav(filename, data);
68 static void createSilence(
const Log& log,
Samples& result)
79 const Samples* expectedSamples[CHANNELS])
81 cout <<
" test " <<
testName <<
" ..." << endl;
83 Samples generatedSamples[CHANNELS];
87 for (
auto& w : l.regWrites) {
91 unsigned samples = l.samples;
95 unsigned oldSize = generatedSamples[0].size();
96 for (
unsigned i = 0; i < CHANNELS; ++i) {
97 generatedSamples[i].resize(oldSize + samples);
98 bufs[i] = &generatedSamples[i][oldSize];
108 for (
unsigned i = 0; i < CHANNELS; ++i) {
109 for (
unsigned j = 0; j < generatedSamples[i].size(); ++j) {
110 int s = generatedSamples[i][j];
112 assert(s ==
short(s));
113 generatedSamples[i][j] = s;
118 for (
unsigned i = 0; i < CHANNELS; ++i) {
120 msg <<
"Error in channel " << i <<
": ";
122 if (generatedSamples[i].
size() != expectedSamples[i]->
size()) {
123 msg <<
"wrong size, expected " << expectedSamples[i]->size()
124 <<
" but got " << generatedSamples[i].size();
126 }
else if (generatedSamples[i] != *expectedSamples[i]) {
133 <<
"-ch" << i <<
".wav";
134 msg <<
" writing data to " << std::string(filename);
136 saveWav(filename, generatedSamples[i]);
141 static void testSingleChannel(
YM2413Core& core,
const Log& log,
142 const Samples& channelData,
unsigned channelNum)
145 createSilence(log, silence);
147 const Samples* samples[CHANNELS];
148 for (
unsigned i = 0; i < CHANNELS; ++i) {
149 if (i == channelNum) {
150 samples[i] = &channelData;
152 samples[i] = &silence;
156 test(core, log, samples);
168 log.push_back(event);
171 createSilence(log, silence);
173 const Samples* samples[CHANNELS];
174 for (
unsigned i = 0; i < CHANNELS; ++i) {
175 samples[i] = &silence;
178 test(core, log, samples);
188 event.regWrites.push_back(
RegWrite(0x10, 0xAD));
189 event.regWrites.push_back(
RegWrite(0x20, 0x14));
190 event.samples = 11000;
191 log.push_back(event);
196 event.samples = 11000;
197 log.push_back(event);
202 event.samples = 11000;
203 log.push_back(event);
208 testSingleChannel(core, log, gold, 0);
211 template<
typename CORE,
typename FUNC>
void testOnCore(FUNC f)
217 template<
typename CORE>
static void testAll(
const string& coreName_)
220 cout <<
"Testing YM2413 core " <<
coreName << endl;
221 testOnCore<CORE>(testSilence);
222 testOnCore<CORE>(testViolin);
228 testAll<YM2413Okazaki:: YM2413>(
"Okazaki");
229 testAll<YM2413Burczynski::YM2413>(
"Burczynski");