From ce253230cebc1705b2bfa1443e3a9f93d096ab8f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 14 May 2022 16:59:07 -0500 Subject: [PATCH] add AICA and YMZ ADPCM formats --- papers/format.md | 2 ++ src/engine/sample.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/engine/sample.h | 14 ++++++++++++-- src/gui/guiConst.cpp | 4 ++-- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/papers/format.md b/papers/format.md index 5dec7082..bd4b57a0 100644 --- a/papers/format.md +++ b/papers/format.md @@ -744,6 +744,8 @@ size | description 1 | depth | - 0: ZX Spectrum overlay drum (1-bit) | - 1: 1-bit NES DPCM (1-bit) + | - 2: AICA ADPCM + | - 3: YMZ ADPCM | - 4: QSound ADPCM | - 5: ADPCM-A | - 6: ADPCM-B diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index e46c267d..e8bc0f30 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -93,6 +93,18 @@ bool DivSample::initInternal(unsigned char d, int count) { dataDPCM=new unsigned char[lengthDPCM]; memset(dataDPCM,0,lengthDPCM); break; + case 2: // AICA ADPCM + if (dataAICA!=NULL) delete[] dataAICA; + lengthAICA=(count+1)/2; + dataAICA=new unsigned char[(lengthAICA+255)&(~0xff)]; + memset(dataAICA,0,(lengthAICA+255)&(~0xff)); + break; + case 3: // YMZ ADPCM + if (dataZ!=NULL) delete[] dataZ; + lengthZ=(count+1)/2; + dataZ=new unsigned char[(lengthZ+255)&(~0xff)]; + memset(dataZ,0,(lengthZ+255)&(~0xff)); + break; case 4: // QSound ADPCM if (dataQSoundA!=NULL) delete[] dataQSoundA; lengthQSoundA=(count+1)/2; @@ -657,6 +669,12 @@ void DivSample::render() { } break; } + case 2: // AICA ADPCM + aica_decode(dataAICA,data16,samples); + break; + case 3: // YMZ ADPCM + ymz_decode(dataZ,data16,samples); + break; case 4: // QSound ADPCM bs_decode(dataQSoundA,data16,samples); break; @@ -709,6 +727,14 @@ void DivSample::render() { if (accum>127) accum=127; } } + if (depth!=2) { // AICA ADPCM + if (!initInternal(2,samples)) return; + aica_encode(data16,dataAICA,(samples+511)&(~0x1ff)); + } + if (depth!=3) { // YMZ ADPCM + if (!initInternal(3,samples)) return; + ymz_encode(data16,dataZ,(samples+511)&(~0x1ff)); + } if (depth!=4) { // QSound ADPCM if (!initInternal(4,samples)) return; bs_encode(data16,dataQSoundA,samples); @@ -745,6 +771,10 @@ void* DivSample::getCurBuf() { return data1; case 1: return dataDPCM; + case 2: + return dataAICA; + case 3: + return dataZ; case 4: return dataQSoundA; case 5: @@ -771,6 +801,10 @@ unsigned int DivSample::getCurBufLen() { return length1; case 1: return lengthDPCM; + case 2: + return lengthAICA; + case 3: + return lengthZ; case 4: return lengthQSoundA; case 5: @@ -881,6 +915,8 @@ DivSample::~DivSample() { if (data16) delete[] data16; if (data1) delete[] data1; if (dataDPCM) delete[] dataDPCM; + if (dataAICA) delete[] dataAICA; + if (dataZ) delete[] dataZ; if (dataQSoundA) delete[] dataQSoundA; if (dataA) delete[] dataA; if (dataB) delete[] dataB; diff --git a/src/engine/sample.h b/src/engine/sample.h index 6e4de094..62413979 100644 --- a/src/engine/sample.h +++ b/src/engine/sample.h @@ -62,6 +62,8 @@ struct DivSample { // valid values are: // - 0: ZX Spectrum overlay drum (1-bit) // - 1: 1-bit NES DPCM (1-bit) + // - 2: AICA ADPCM + // - 3: YMZ ADPCM // - 4: QSound ADPCM // - 5: ADPCM-A // - 6: ADPCM-B @@ -77,6 +79,8 @@ struct DivSample { short* data16; // 16 unsigned char* data1; // 0 unsigned char* dataDPCM; // 1 + unsigned char* dataAICA; // 2 + unsigned char* dataZ; // 3 unsigned char* dataQSoundA; // 4 unsigned char* dataA; // 5 unsigned char* dataB; // 6 @@ -84,8 +88,8 @@ struct DivSample { unsigned char* dataBRR; // 9 unsigned char* dataVOX; // 10 - unsigned int length8, length16, length1, lengthDPCM, lengthQSoundA, lengthA, lengthB, lengthX68, lengthBRR, lengthVOX; - unsigned int off8, off16, off1, offDPCM, offQSoundA, offA, offB, offX68, offBRR, offVOX; + unsigned int length8, length16, length1, lengthDPCM, lengthAICA, lengthZ, lengthQSoundA, lengthA, lengthB, lengthX68, lengthBRR, lengthVOX; + unsigned int off8, off16, off1, offDPCM, offAICA, offZ, offQSoundA, offA, offB, offX68, offBRR, offVOX; unsigned int offSegaPCM, offQSound, offX1_010, offSU; unsigned int samples; @@ -218,6 +222,8 @@ struct DivSample { data16(NULL), data1(NULL), dataDPCM(NULL), + dataAICA(NULL), + dataZ(NULL), dataQSoundA(NULL), dataA(NULL), dataB(NULL), @@ -228,6 +234,8 @@ struct DivSample { length16(0), length1(0), lengthDPCM(0), + lengthAICA(0), + lengthZ(0), lengthQSoundA(0), lengthA(0), lengthB(0), @@ -238,6 +246,8 @@ struct DivSample { off16(0), off1(0), offDPCM(0), + offAICA(0), + offZ(0), offQSoundA(0), offA(0), offB(0), diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index a02543aa..0afee14c 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -116,8 +116,8 @@ const char* insTypes[DIV_INS_MAX]={ const char* sampleDepths[17]={ "1-bit PCM", "1-bit DPCM", - NULL, - NULL, + "Yamaha AICA", + "YMZ/YMU ADPCM", "QSound ADPCM", "ADPCM-A", "ADPCM-B",