summaryrefslogtreecommitdiff
path: root/src/adplug/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/adplug/core')
-rw-r--r--src/adplug/core/README.audacious10
-rw-r--r--src/adplug/core/a2m.cc484
-rw-r--r--src/adplug/core/a2m.h83
-rw-r--r--src/adplug/core/adl.cc2439
-rw-r--r--src/adplug/core/adl.h80
-rw-r--r--src/adplug/core/adlibemu.cc544
-rw-r--r--src/adplug/core/adlibemu.h26
-rw-r--r--src/adplug/core/adplug.cc184
-rw-r--r--src/adplug/core/adplug.h54
-rw-r--r--src/adplug/core/adtrack.cc176
-rw-r--r--src/adplug/core/adtrack.h53
-rw-r--r--src/adplug/core/amd.cc193
-rw-r--r--src/adplug/core/amd.h49
-rw-r--r--src/adplug/core/bam.cc203
-rw-r--r--src/adplug/core/bam.h56
-rw-r--r--src/adplug/core/bmf.cc603
-rw-r--r--src/adplug/core/bmf.h91
-rw-r--r--src/adplug/core/cff.cc501
-rw-r--r--src/adplug/core/cff.h103
-rw-r--r--src/adplug/core/cmf.cc787
-rw-r--r--src/adplug/core/cmf.h112
-rw-r--r--src/adplug/core/d00.cc549
-rw-r--r--src/adplug/core/d00.h109
-rw-r--r--src/adplug/core/database.cc426
-rw-r--r--src/adplug/core/database.h169
-rw-r--r--src/adplug/core/debug.h39
-rw-r--r--src/adplug/core/dfm.cc116
-rw-r--r--src/adplug/core/dfm.h52
-rw-r--r--src/adplug/core/dmo.cc419
-rw-r--r--src/adplug/core/dmo.h51
-rw-r--r--src/adplug/core/dro.cc141
-rw-r--r--src/adplug/core/dro.h52
-rw-r--r--src/adplug/core/dro2.cc142
-rw-r--r--src/adplug/core/dro2.h60
-rw-r--r--src/adplug/core/dtm.cc317
-rw-r--r--src/adplug/core/dtm.h69
-rw-r--r--src/adplug/core/emuopl.cc147
-rw-r--r--src/adplug/core/emuopl.h47
-rw-r--r--src/adplug/core/flash.cc230
-rw-r--r--src/adplug/core/flash.h57
-rw-r--r--src/adplug/core/fmc.cc225
-rw-r--r--src/adplug/core/fmc.h91
-rw-r--r--src/adplug/core/fmopl.cc1392
-rw-r--r--src/adplug/core/fmopl.h174
-rw-r--r--src/adplug/core/fprovide.cc63
-rw-r--r--src/adplug/core/fprovide.h49
-rw-r--r--src/adplug/core/hsc.cc317
-rw-r--r--src/adplug/core/hsc.h75
-rw-r--r--src/adplug/core/hsp.cc75
-rw-r--r--src/adplug/core/hsp.h39
-rw-r--r--src/adplug/core/hybrid.cc248
-rw-r--r--src/adplug/core/hybrid.h80
-rw-r--r--src/adplug/core/hyp.cc125
-rw-r--r--src/adplug/core/hyp.h53
-rw-r--r--src/adplug/core/imf.cc197
-rw-r--r--src/adplug/core/imf.h68
-rw-r--r--src/adplug/core/jbm.cc293
-rw-r--r--src/adplug/core/jbm.h80
-rw-r--r--src/adplug/core/kemuopl.h61
-rw-r--r--src/adplug/core/ksm.cc337
-rw-r--r--src/adplug/core/ksm.h62
-rw-r--r--src/adplug/core/lds.cc678
-rw-r--r--src/adplug/core/lds.h91
-rw-r--r--src/adplug/core/mad.cc127
-rw-r--r--src/adplug/core/mad.h48
-rw-r--r--src/adplug/core/mid.cc1110
-rw-r--r--src/adplug/core/mid.h112
-rw-r--r--src/adplug/core/mididata.h174
-rw-r--r--src/adplug/core/mkj.cc164
-rw-r--r--src/adplug/core/mkj.h50
-rw-r--r--src/adplug/core/msc.cc313
-rw-r--r--src/adplug/core/msc.h87
-rw-r--r--src/adplug/core/mtk.cc141
-rw-r--r--src/adplug/core/mtk.h50
-rw-r--r--src/adplug/core/opl.h69
-rw-r--r--src/adplug/core/player.cc70
-rw-r--r--src/adplug/core/player.h85
-rw-r--r--src/adplug/core/players.cc105
-rw-r--r--src/adplug/core/players.h60
-rw-r--r--src/adplug/core/protrack.cc829
-rw-r--r--src/adplug/core/protrack.h119
-rw-r--r--src/adplug/core/psi.cc177
-rw-r--r--src/adplug/core/psi.h64
-rw-r--r--src/adplug/core/rad.cc125
-rw-r--r--src/adplug/core/rad.h44
-rw-r--r--src/adplug/core/rat.cc293
-rw-r--r--src/adplug/core/rat.h121
-rw-r--r--src/adplug/core/raw.cc104
-rw-r--r--src/adplug/core/raw.h52
-rw-r--r--src/adplug/core/rix.cc495
-rw-r--r--src/adplug/core/rix.h112
-rw-r--r--src/adplug/core/rol.cc724
-rw-r--r--src/adplug/core/rol.h309
-rw-r--r--src/adplug/core/s3m.cc545
-rw-r--r--src/adplug/core/s3m.h107
-rw-r--r--src/adplug/core/sa2.cc263
-rw-r--r--src/adplug/core/sa2.h55
-rw-r--r--src/adplug/core/silentopl.h29
-rw-r--r--src/adplug/core/sng.cc85
-rw-r--r--src/adplug/core/sng.h64
-rw-r--r--src/adplug/core/temuopl.cc75
-rw-r--r--src/adplug/core/temuopl.h45
-rw-r--r--src/adplug/core/u6m.cc934
-rw-r--r--src/adplug/core/u6m.h168
-rw-r--r--src/adplug/core/xad.cc140
-rw-r--r--src/adplug/core/xad.h97
-rw-r--r--src/adplug/core/xsm.cc117
-rw-r--r--src/adplug/core/xsm.h46
108 files changed, 0 insertions, 23999 deletions
diff --git a/src/adplug/core/README.audacious b/src/adplug/core/README.audacious
deleted file mode 100644
index 7732398..0000000
--- a/src/adplug/core/README.audacious
+++ /dev/null
@@ -1,10 +0,0 @@
-This is a summary of changes made to the AdPlug core in the plugin for
-Audacious:
-
-- every replayer is now passed a VFS fd
-- there is a binio virtual which is now used to wrap the VFS in a way
- that is non-intrusive
-- some blatantly bad coding practices have been corrected
-
---
-William Pitcock <nenolod -at- sacredspiral.co.uk>
diff --git a/src/adplug/core/a2m.cc b/src/adplug/core/a2m.cc
deleted file mode 100644
index dd59a58..0000000
--- a/src/adplug/core/a2m.cc
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * a2m.cpp - A2M Loader by Simon Peter <dn.tlp@gmx.net>
- *
- * NOTES:
- * This loader detects and loads version 1, 4, 5 & 8 files.
- *
- * version 1-4 files:
- * Following commands are ignored: FF1 - FF9, FAx - FEx
- *
- * version 5-8 files:
- * Instrument panning is ignored. Flags byte is ignored.
- * Following commands are ignored: Gxy, Hxy, Kxy - &xy
- */
-
-#include <cstring>
-#include "a2m.h"
-
-const unsigned int Ca2mLoader::MAXFREQ = 2000,
-Ca2mLoader::MINCOPY = ADPLUG_A2M_MINCOPY,
-Ca2mLoader::MAXCOPY = ADPLUG_A2M_MAXCOPY,
-Ca2mLoader::COPYRANGES = ADPLUG_A2M_COPYRANGES,
-Ca2mLoader::CODESPERRANGE = ADPLUG_A2M_CODESPERRANGE,
-Ca2mLoader::TERMINATE = 256,
-Ca2mLoader::FIRSTCODE = ADPLUG_A2M_FIRSTCODE,
-Ca2mLoader::MAXCHAR = FIRSTCODE + COPYRANGES * CODESPERRANGE - 1,
-Ca2mLoader::SUCCMAX = MAXCHAR + 1,
-Ca2mLoader::TWICEMAX = ADPLUG_A2M_TWICEMAX,
-Ca2mLoader::ROOT = 1, Ca2mLoader::MAXBUF = 42 * 1024,
-Ca2mLoader::MAXDISTANCE = 21389, Ca2mLoader::MAXSIZE = 21389 + MAXCOPY;
-
-const unsigned short Ca2mLoader::bitvalue[14] =
- {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192};
-
-const signed short Ca2mLoader::copybits[COPYRANGES] =
- {4, 6, 8, 10, 12, 14};
-
-const signed short Ca2mLoader::copymin[COPYRANGES] =
- {0, 16, 80, 336, 1360, 5456};
-
-CPlayer *Ca2mLoader::factory(Copl *newopl)
-{
- return new Ca2mLoader(newopl);
-}
-
-bool Ca2mLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[10];
- int i,j,k,t;
- unsigned int l;
- unsigned char *org = nullptr, *orgptr, flags = 0, numpats, version;
- unsigned long alength;
- unsigned short len[9], *secdata, *secptr;
- const unsigned char convfx[16] = {0,1,2,23,24,3,5,4,6,9,17,13,11,19,7,14};
- const unsigned char convinf1[16] = {0,1,2,6,7,8,9,4,5,3,10,11,12,13,14,15};
- const unsigned char newconvfx[] = {0,1,2,3,4,5,6,23,24,21,10,11,17,13,7,19,
- 255,255,22,25,255,15,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,14,255};
-
- // read header
- f->readString(id, 10); (void)f->readInt(4);
- version = f->readInt(1); numpats = f->readInt(1);
-
- // file validation section
- if(strncmp(id,"_A2module_",10) || (version != 1 && version != 5 &&
- version != 4 && version != 8)) {
- fp.close(f);
- return false;
- }
-
- // load, depack & convert section
- nop = numpats; length = 128; restartpos = 0;
- if(version < 5) {
- for(i=0;i<5;i++) len[i] = f->readInt(2);
- t = 9;
- } else { // version >= 5
- for(i=0;i<9;i++) len[i] = f->readInt(2);
- t = 18;
- }
-
- // block 0
- secdata = new unsigned short [len[0] / 2];
- if(version == 1 || version == 5) {
- for(i=0;i<len[0]/2;i++) secdata[i] = f->readInt(2);
- org = new unsigned char [MAXBUF]; orgptr = org;
- sixdepak(secdata,org,len[0]);
- } else {
- orgptr = (unsigned char *)secdata;
- for(i=0;i<len[0];i++) orgptr[i] = f->readInt(1);
- }
- memcpy(songname,orgptr,43); orgptr += 43;
- memcpy(author,orgptr,43); orgptr += 43;
- memcpy(instname,orgptr,250*33); orgptr += 250*33;
-
- for(i=0;i<250;i++) { // instruments
- inst[i].data[0] = *(orgptr+i*13+10);
- inst[i].data[1] = *(orgptr+i*13);
- inst[i].data[2] = *(orgptr+i*13+1);
- inst[i].data[3] = *(orgptr+i*13+4);
- inst[i].data[4] = *(orgptr+i*13+5);
- inst[i].data[5] = *(orgptr+i*13+6);
- inst[i].data[6] = *(orgptr+i*13+7);
- inst[i].data[7] = *(orgptr+i*13+8);
- inst[i].data[8] = *(orgptr+i*13+9);
- inst[i].data[9] = *(orgptr+i*13+2);
- inst[i].data[10] = *(orgptr+i*13+3);
-
- if(version < 5)
- inst[i].misc = *(orgptr+i*13+11);
- else { // version >= 5 -> OPL3 format
- int pan = *(orgptr+i*13+11);
-
- if(pan)
- inst[i].data[0] |= (pan & 3) << 4; // set pan
- else
- inst[i].data[0] |= 48; // enable both speakers
- }
-
- inst[i].slide = *(orgptr+i*13+12);
- }
-
- orgptr += 250*13;
- memcpy(order,orgptr,128); orgptr += 128;
- bpm = *orgptr; orgptr++;
- initspeed = *orgptr; orgptr++;
- if(version >= 5) flags = *orgptr;
- if(version == 1 || version == 5) delete [] org;
- delete [] secdata;
-
- // blocks 1-4 or 1-8
- alength = len[1];
- for(i = 0; i < (version < 5 ? numpats / 16 : numpats / 8); i++)
- alength += len[i+2];
-
- secdata = new unsigned short [alength / 2];
- if(version == 1 || version == 5) {
- for(l=0;l<alength/2;l++) secdata[l] = f->readInt(2);
- org = new unsigned char [MAXBUF * (numpats / (version == 1 ? 16 : 8) + 1)];
- orgptr = org; secptr = secdata;
- orgptr += sixdepak(secptr,orgptr,len[1]); secptr += len[1] / 2;
- if(version == 1) {
- if(numpats > 16)
- { orgptr += sixdepak(secptr,orgptr,len[2]); secptr += len[2] / 2; }
- if(numpats > 32)
- { orgptr += sixdepak(secptr,orgptr,len[3]); secptr += len[3] / 2; }
- if(numpats > 48)
- sixdepak(secptr,orgptr,len[4]);
- } else {
- if(numpats > 8)
- { orgptr += sixdepak(secptr,orgptr,len[2]); secptr += len[2] / 2; }
- if(numpats > 16)
- { orgptr += sixdepak(secptr,orgptr,len[3]); secptr += len[3] / 2; }
- if(numpats > 24)
- { orgptr += sixdepak(secptr,orgptr,len[4]); secptr += len[4] / 2; }
- if(numpats > 32)
- { orgptr += sixdepak(secptr,orgptr,len[5]); secptr += len[5] / 2; }
- if(numpats > 40)
- { orgptr += sixdepak(secptr,orgptr,len[6]); secptr += len[6] / 2; }
- if(numpats > 48)
- { orgptr += sixdepak(secptr,orgptr,len[7]); secptr += len[7] / 2; }
- if(numpats > 56)
- sixdepak(secptr,orgptr,len[8]);
- }
- delete [] secdata;
- } else {
- org = (unsigned char *)secdata;
- for(l=0;l<alength;l++) org[l] = f->readInt(1);
- }
-
- if(version < 5) {
- for(i=0;i<numpats;i++)
- for(j=0;j<64;j++)
- for(k=0;k<9;k++) {
- struct Tracks *track = &tracks[i * 9 + k][j];
- unsigned char *o = &org[i*64*t*4+j*t*4+k*4];
-
- track->note = o[0] == 255 ? 127 : o[0];
- track->inst = o[1];
- track->command = convfx[o[2]];
- track->param2 = o[3] & 0x0f;
- if(track->command != 14)
- track->param1 = o[3] >> 4;
- else {
- track->param1 = convinf1[o[3] >> 4];
- if(track->param1 == 15 && !track->param2) { // convert key-off
- track->command = 8;
- track->param1 = 0;
- track->param2 = 0;
- }
- }
- if(track->command == 14) {
- switch(track->param1) {
- case 2: // convert define waveform
- track->command = 25;
- track->param1 = track->param2;
- track->param2 = 0xf;
- break;
- case 8: // convert volume slide up
- track->command = 26;
- track->param1 = track->param2;
- track->param2 = 0;
- break;
- case 9: // convert volume slide down
- track->command = 26;
- track->param1 = 0;
- break;
- }
- }
- }
- } else { // version >= 5
- realloc_patterns(64, 64, 18);
-
- for(i=0;i<numpats;i++)
- for(j=0;j<18;j++)
- for(k=0;k<64;k++) {
- struct Tracks *track = &tracks[i * 18 + j][k];
- unsigned char *o = &org[i*64*t*4+j*64*4+k*4];
-
- track->note = o[0] == 255 ? 127 : o[0];
- track->inst = o[1];
- track->command = newconvfx[o[2]];
- track->param1 = o[3] >> 4;
- track->param2 = o[3] & 0x0f;
-
- // Convert '&' command
- if(o[2] == 36)
- switch(track->param1) {
- case 0: // pattern delay (frames)
- track->command = 29;
- track->param1 = 0;
- // param2 already set correctly
- break;
-
- case 1: // pattern delay (rows)
- track->command = 14;
- track->param1 = 8;
- // param2 already set correctly
- break;
- }
- }
- }
-
- init_trackord();
-
- if(version == 1 || version == 5)
- delete [] org;
- else
- delete [] secdata;
-
- // Process flags
- if(version >= 5) {
- CmodPlayer::flags |= Opl3; // All versions >= 5 are OPL3
- if(flags & 8) CmodPlayer::flags |= Tremolo; // Tremolo depth
- if(flags & 16) CmodPlayer::flags |= Vibrato; // Vibrato depth
- }
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-float Ca2mLoader::getrefresh()
-{
- if(tempo != 18)
- return (float) (tempo);
- else
- return 18.2f;
-}
-
-/*** private methods *************************************/
-
-void Ca2mLoader::inittree()
-{
- unsigned short i;
-
- for(i=2;i<=TWICEMAX;i++) {
- dad[i] = i / 2;
- freq[i] = 1;
- }
-
- for(i=1;i<=MAXCHAR;i++) {
- leftc[i] = 2 * i;
- rghtc[i] = 2 * i + 1;
- }
-}
-
-void Ca2mLoader::updatefreq(unsigned short a,unsigned short b)
-{
- do {
- freq[dad[a]] = freq[a] + freq[b];
- a = dad[a];
- if(a != ROOT) {
- if(leftc[dad[a]] == a)
- b = rghtc[dad[a]];
- else
- b = leftc[dad[a]];
- }
- } while(a != ROOT);
-
- if(freq[ROOT] == MAXFREQ)
- for(a=1;a<=TWICEMAX;a++)
- freq[a] >>= 1;
-}
-
-void Ca2mLoader::updatemodel(unsigned short code)
-{
- unsigned short a=code+SUCCMAX,b,c,code1,code2;
-
- freq[a]++;
- if(dad[a] != ROOT) {
- code1 = dad[a];
- if(leftc[code1] == a)
- updatefreq(a,rghtc[code1]);
- else
- updatefreq(a,leftc[code1]);
-
- do {
- code2 = dad[code1];
- if(leftc[code2] == code1)
- b = rghtc[code2];
- else
- b = leftc[code2];
-
- if(freq[a] > freq[b]) {
- if(leftc[code2] == code1)
- rghtc[code2] = a;
- else
- leftc[code2] = a;
-
- if(leftc[code1] == a) {
- leftc[code1] = b;
- c = rghtc[code1];
- } else {
- rghtc[code1] = b;
- c = leftc[code1];
- }
-
- dad[b] = code1;
- dad[a] = code2;
- updatefreq(b,c);
- a = b;
- }
-
- a = dad[a];
- code1 = dad[a];
- } while(code1 != ROOT);
- }
-}
-
-unsigned short Ca2mLoader::inputcode(unsigned short bits)
-{
- unsigned short i,code=0;
-
- for(i=1;i<=bits;i++) {
- if(!ibitcount) {
- if(ibitcount == MAXBUF)
- ibufcount = 0;
- ibitbuffer = wdbuf[ibufcount];
- ibufcount++;
- ibitcount = 15;
- } else
- ibitcount--;
-
- if(ibitbuffer > 0x7fff)
- code |= bitvalue[i-1];
- ibitbuffer <<= 1;
- }
-
- return code;
-}
-
-unsigned short Ca2mLoader::uncompress()
-{
- unsigned short a=1;
-
- do {
- if(!ibitcount) {
- if(ibufcount == MAXBUF)
- ibufcount = 0;
- ibitbuffer = wdbuf[ibufcount];
- ibufcount++;
- ibitcount = 15;
- } else
- ibitcount--;
-
- if(ibitbuffer > 0x7fff)
- a = rghtc[a];
- else
- a = leftc[a];
- ibitbuffer <<= 1;
- } while(a <= MAXCHAR);
-
- a -= SUCCMAX;
- updatemodel(a);
- return a;
-}
-
-void Ca2mLoader::decode()
-{
- unsigned short i,j,k,t,c,count=0,dist,len,index;
-
- inittree();
- c = uncompress();
-
- while(c != TERMINATE) {
- if(c < 256) {
- obuf[obufcount] = (unsigned char)c;
- obufcount++;
- if(obufcount == MAXBUF) {
- output_size = MAXBUF;
- obufcount = 0;
- }
-
- buf[count] = (unsigned char)c;
- count++;
- if(count == MAXSIZE)
- count = 0;
- } else {
- t = c - FIRSTCODE;
- index = t / CODESPERRANGE;
- len = t + MINCOPY - index * CODESPERRANGE;
- dist = inputcode(copybits[index]) + len + copymin[index];
-
- j = count;
- k = count - dist;
- if(count < dist)
- k += MAXSIZE;
-
- for(i=0;i<=len-1;i++) {
- obuf[obufcount] = buf[k];
- obufcount++;
- if(obufcount == MAXBUF) {
- output_size = MAXBUF;
- obufcount = 0;
- }
-
- buf[j] = buf[k];
- j++; k++;
- if(j == MAXSIZE) j = 0;
- if(k == MAXSIZE) k = 0;
- }
-
- count += len;
- if(count >= MAXSIZE)
- count -= MAXSIZE;
- }
- c = uncompress();
- }
- output_size = obufcount;
-}
-
-unsigned short Ca2mLoader::sixdepak(unsigned short *source, unsigned char *dest,
- unsigned short size)
-{
- if((unsigned int)size + 4096 > MAXBUF)
- return 0;
-
- buf = new unsigned char [MAXSIZE];
- input_size = size;
- ibitcount = 0; ibitbuffer = 0;
- obufcount = 0; ibufcount = 0;
- wdbuf = source; obuf = dest;
-
- decode();
- delete [] buf;
- return output_size;
-}
diff --git a/src/adplug/core/a2m.h b/src/adplug/core/a2m.h
deleted file mode 100644
index 7867d85..0000000
--- a/src/adplug/core/a2m.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * a2m.h - A2M Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_A2MLOADER
-#define H_ADPLUG_A2MLOADER
-
-#include "protrack.h"
-
-class Ca2mLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- Ca2mLoader(Copl *newopl): CmodPlayer(newopl)
- { }
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype()
- { return std::string("AdLib Tracker 2"); }
- std::string gettitle()
- { if(*songname) return std::string(songname,1,*songname); else return std::string(); }
- std::string getauthor()
- { if(*author) return std::string(author,1,*author); else return std::string(); }
- unsigned int getinstruments()
- { return 250; }
- std::string getinstrument(unsigned int n)
- { return std::string(instname[n],1,*instname[n]); }
-
-private:
-
-#define ADPLUG_A2M_COPYRANGES 6
-#define ADPLUG_A2M_FIRSTCODE 257
-#define ADPLUG_A2M_MINCOPY 3
-#define ADPLUG_A2M_MAXCOPY 255
-#define ADPLUG_A2M_CODESPERRANGE (ADPLUG_A2M_MAXCOPY - ADPLUG_A2M_MINCOPY + 1)
-#define ADPLUG_A2M_MAXCHAR (ADPLUG_A2M_FIRSTCODE + ADPLUG_A2M_COPYRANGES * ADPLUG_A2M_CODESPERRANGE - 1)
-#define ADPLUG_A2M_TWICEMAX (2 * ADPLUG_A2M_MAXCHAR + 1)
-
- static const unsigned int MAXFREQ, MINCOPY, MAXCOPY, COPYRANGES,
- CODESPERRANGE, TERMINATE, FIRSTCODE, MAXCHAR, SUCCMAX, TWICEMAX, ROOT,
- MAXBUF, MAXDISTANCE, MAXSIZE;
-
- static const unsigned short bitvalue[14];
- static const signed short copybits[ADPLUG_A2M_COPYRANGES],
- copymin[ADPLUG_A2M_COPYRANGES];
-
- void inittree();
- void updatefreq(unsigned short a,unsigned short b);
- void updatemodel(unsigned short code);
- unsigned short inputcode(unsigned short bits);
- unsigned short uncompress();
- void decode();
- unsigned short sixdepak(unsigned short *source,unsigned char *dest,unsigned short size);
-
- char songname[43], author[43], instname[250][33];
-
- unsigned short ibitcount, ibitbuffer, ibufcount, obufcount, input_size,
- output_size, leftc[ADPLUG_A2M_MAXCHAR+1], rghtc[ADPLUG_A2M_MAXCHAR+1],
- dad[ADPLUG_A2M_TWICEMAX+1], freq[ADPLUG_A2M_TWICEMAX+1], *wdbuf;
- unsigned char *obuf, *buf;
-};
-
-#endif
diff --git a/src/adplug/core/adl.cc b/src/adplug/core/adl.cc
deleted file mode 100644
index b27d1bf..0000000
--- a/src/adplug/core/adl.cc
+++ /dev/null
@@ -1,2439 +0,0 @@
-/*
- * adl.cpp - ADL player adaption by Simon Peter <dn.tlp@gmx.net>
- *
- * Original ADL player by Torbjorn Andersson and Johannes Schickel
- * 'lordhoto' <lordhoto at scummvm dot org> of the ScummVM project.
- */
-
-/* ScummVM - Scumm Interpreter
- *
- * This file is licensed under both GPL and LGPL
- * Copyright (C) 2006 The ScummVM project
- * Copyright (C) 2006 Torbjorn Andersson and Johannes Schickel
- *
- * GPL License
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * LPGL License
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
-
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
-
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * $URL: https://svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/engines/kyra/sound_adlib.cpp $
- * $Id: adl.cpp,v 1.11 2008/02/11 20:18:27 dynamite Exp $
- *
- */
-
-#include <cstring>
-#include <inttypes.h>
-#include <stdarg.h>
-#include <assert.h>
-
-#include "adl.h"
-#include "debug.h"
-
-#ifdef ADL_DEBUG
-# define warning(...) AdPlug_LogWrite(__VA_ARGS__); \
-AdPlug_LogWrite("\n")
-
-# define debugC(i1, i2, ...) AdPlug_LogWrite(__VA_ARGS__); \
-AdPlug_LogWrite("\n")
-#else
-# define kDebugLevelSound 1
-
-static inline void warning(const char *str, ...)
-{
-}
-
-static inline void debugC(int i1, int i2, const char *str, ...)
-{
-}
-#endif
-
-// #define warning(...)
-// #define debugC(i1, i2, ...)
-
-#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
-
-// Basic Adlib Programming:
-// http://www.gamedev.net/reference/articles/article446.asp
-
-#define CALLBACKS_PER_SECOND 72
-
-typedef uint8_t uint8;
-typedef int8_t int8;
-typedef uint16_t uint16;
-typedef int16_t int16;
-typedef uint32_t uint32;
-typedef int32_t int32;
-typedef uint8_t byte;
-
-static inline uint16 READ_LE_UINT16(const void *ptr) {
- const byte *b = (const byte *)ptr;
- return (b[1] << 8) + b[0];
-}
-
-static inline uint16 READ_BE_UINT16(const void *ptr) {
- const byte *b = (const byte *)ptr;
- return (b[0] << 8) + b[1];
-}
-
-class AdlibDriver {
-public:
- AdlibDriver(Copl *opl);
- ~AdlibDriver();
-
- int callback(int opcode, ...);
- void callback();
-
- // AudioStream API
- // int readBuffer(int16 *buffer, const int numSamples) {
- // int32 samplesLeft = numSamples;
- // memset(buffer, 0, sizeof(int16) * numSamples);
- // while (samplesLeft) {
- // if (!_samplesTillCallback) {
- // callback();
- // _samplesTillCallback = _samplesPerCallback;
- // _samplesTillCallbackRemainder += _samplesPerCallbackRemainder;
- // if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) {
- // _samplesTillCallback++;
- // _samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND;
- // }
- // }
-
- // int32 render = MIN(samplesLeft, _samplesTillCallback);
- // samplesLeft -= render;
- // _samplesTillCallback -= render;
- // YM3812UpdateOne(_adlib, buffer, render);
- // buffer += render;
- // }
- // return numSamples;
- // }
-
- bool isStereo() const { return false; }
- bool endOfData() const { return false; }
- // int getRate() const { return _mixer->getOutputRate(); }
-
- struct OpcodeEntry {
- typedef int (AdlibDriver::*DriverOpcode)(va_list &list);
- DriverOpcode function;
- const char *name;
- };
-
- void setupOpcodeList();
- const OpcodeEntry *_opcodeList;
- int _opcodesEntries;
-
- int snd_ret0x100(va_list &list);
- int snd_ret0x1983(va_list &list);
- int snd_initDriver(va_list &list);
- int snd_deinitDriver(va_list &list);
- int snd_setSoundData(va_list &list);
- int snd_unkOpcode1(va_list &list);
- int snd_startSong(va_list &list);
- int snd_unkOpcode2(va_list &list);
- int snd_unkOpcode3(va_list &list);
- int snd_readByte(va_list &list);
- int snd_writeByte(va_list &list);
- int snd_getSoundTrigger(va_list &list);
- int snd_unkOpcode4(va_list &list);
- int snd_dummy(va_list &list);
- int snd_getNullvar4(va_list &list);
- int snd_setNullvar3(va_list &list);
- int snd_setFlag(va_list &list);
- int snd_clearFlag(va_list &list);
-
- // These variables have not yet been named, but some of them are partly
- // known nevertheless:
- //
- // unk16 - Sound-related. Possibly some sort of pitch bend.
- // unk18 - Sound-effect. Used for secondaryEffect1()
- // unk19 - Sound-effect. Used for secondaryEffect1()
- // unk20 - Sound-effect. Used for secondaryEffect1()
- // unk21 - Sound-effect. Used for secondaryEffect1()
- // unk22 - Sound-effect. Used for secondaryEffect1()
- // unk29 - Sound-effect. Used for primaryEffect1()
- // unk30 - Sound-effect. Used for primaryEffect1()
- // unk31 - Sound-effect. Used for primaryEffect1()
- // unk32 - Sound-effect. Used for primaryEffect2()
- // unk33 - Sound-effect. Used for primaryEffect2()
- // unk34 - Sound-effect. Used for primaryEffect2()
- // unk35 - Sound-effect. Used for primaryEffect2()
- // unk36 - Sound-effect. Used for primaryEffect2()
- // unk37 - Sound-effect. Used for primaryEffect2()
- // unk38 - Sound-effect. Used for primaryEffect2()
- // unk39 - Currently unused, except for updateCallback56()
- // unk40 - Currently unused, except for updateCallback56()
- // unk41 - Sound-effect. Used for primaryEffect2()
-
- struct Channel {
- uint8 opExtraLevel2;
- uint8 *dataptr;
- uint8 duration;
- uint8 repeatCounter;
- int8 baseOctave;
- uint8 priority;
- uint8 dataptrStackPos;
- uint8 *dataptrStack[4];
- int8 baseNote;
- uint8 unk29;
- uint8 unk31;
- uint16 unk30;
- uint16 unk37;
- uint8 unk33;
- uint8 unk34;
- uint8 unk35;
- uint8 unk36;
- uint8 unk32;
- uint8 unk41;
- uint8 unk38;
- uint8 opExtraLevel1;
- uint8 spacing2;
- uint8 baseFreq;
- uint8 tempo;
- uint8 position;
- uint8 regAx;
- uint8 regBx;
- typedef void (AdlibDriver::*Callback)(Channel&);
- Callback primaryEffect;
- Callback secondaryEffect;
- uint8 fractionalSpacing;
- uint8 opLevel1;
- uint8 opLevel2;
- uint8 opExtraLevel3;
- uint8 twoChan;
- uint8 unk39;
- uint8 unk40;
- uint8 spacing1;
- uint8 durationRandomness;
- uint8 unk19;
- uint8 unk18;
- int8 unk20;
- int8 unk21;
- uint8 unk22;
- uint16 offset;
- uint8 tempoReset;
- uint8 rawNote;
- int8 unk16;
- };
-
- void primaryEffect1(Channel &channel);
- void primaryEffect2(Channel &channel);
- void secondaryEffect1(Channel &channel);
-
- void resetAdlibState();
- void writeOPL(byte reg, byte val);
- void initChannel(Channel &channel);
- void noteOff(Channel &channel);
- void unkOutput2(uint8 num);
-
- uint16 getRandomNr();
- void setupDuration(uint8 duration, Channel &channel);
-
- void setupNote(uint8 rawNote, Channel &channel, bool flag = false);
- void setupInstrument(uint8 regOffset, uint8 *dataptr, Channel &channel);
- void noteOn(Channel &channel);
-
- void adjustVolume(Channel &channel);
-
- uint8 calculateOpLevel1(Channel &channel);
- uint8 calculateOpLevel2(Channel &channel);
-
- uint16 checkValue(int16 val) {
- if (val < 0)
- val = 0;
- else if (val > 0x3F)
- val = 0x3F;
- return val;
- }
-
- // The sound data has at least two lookup tables:
- //
- // * One for programs, starting at offset 0.
- // * One for instruments, starting at offset 500.
-
- uint8 *getProgram(int progId) {
- return _soundData + READ_LE_UINT16(_soundData + 2 * progId);
- }
-
- uint8 *getInstrument(int instrumentId) {
- return _soundData + READ_LE_UINT16(_soundData + 500 + 2 * instrumentId);
- }
-
- void setupPrograms();
- void executePrograms();
-
- struct ParserOpcode {
- typedef int (AdlibDriver::*POpcode)(uint8 *&dataptr, Channel &channel, uint8 value);
- POpcode function;
- const char *name;
- };
-
- void setupParserOpcodeTable();
- const ParserOpcode *_parserOpcodeTable;
- int _parserOpcodeTableSize;
-
- int update_setRepeat(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_checkRepeat(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupProgram(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_jump(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_jumpToSubroutine(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_returnFromSubroutine(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setBaseOctave(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_stopChannel(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_playRest(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_writeAdlib(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupNoteAndDuration(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setBaseNote(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupPrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_removePrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setBaseFreq(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupPrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setPriority(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback23(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback24(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupDuration(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_playNote(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setFractionalNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setTempo(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_removeSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setExtraLevel3(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_changeExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setAMDepth(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setVibratoDepth(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_changeExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback38(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback39(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_removePrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback41(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_resetToGlobalTempo(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_nop1(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setDurationRandomness(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_changeChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback46(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_nop2(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setupRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_playRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_removeRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback51(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback52(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback53(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setSoundTrigger(uint8 *&dataptr, Channel &channel, uint8 value);
- int update_setTempoReset(uint8 *&dataptr, Channel &channel, uint8 value);
- int updateCallback56(uint8 *&dataptr, Channel &channel, uint8 value);
-
- // These variables have not yet been named, but some of them are partly
- // known nevertheless:
- //
- // _unkValue1 - Unknown. Used for updating _unkValue2
- // _unkValue2 - Unknown. Used for updating _unkValue4
- // _unkValue3 - Unknown. Used for updating _unkValue2
- // _unkValue4 - Unknown. Used for updating _unkValue5
- // _unkValue5 - Unknown. Used for controlling updateCallback24().
- // _unkValue6 - Unknown. Rhythm section volume?
- // _unkValue7 - Unknown. Rhythm section volume?
- // _unkValue8 - Unknown. Rhythm section volume?
- // _unkValue9 - Unknown. Rhythm section volume?
- // _unkValue10 - Unknown. Rhythm section volume?
- // _unkValue11 - Unknown. Rhythm section volume?
- // _unkValue12 - Unknown. Rhythm section volume?
- // _unkValue13 - Unknown. Rhythm section volume?
- // _unkValue14 - Unknown. Rhythm section volume?
- // _unkValue15 - Unknown. Rhythm section volume?
- // _unkValue16 - Unknown. Rhythm section volume?
- // _unkValue17 - Unknown. Rhythm section volume?
- // _unkValue18 - Unknown. Rhythm section volume?
- // _unkValue19 - Unknown. Rhythm section volume?
- // _unkValue20 - Unknown. Rhythm section volume?
- // _unkTable[] - Probably frequences for the 12-tone scale.
- // _unkTable2[] - Unknown. Currently only used by updateCallback46()
- // _unkTable2_1[] - One of the tables in _unkTable2[]
- // _unkTable2_2[] - One of the tables in _unkTable2[]
- // _unkTable2_3[] - One of the tables in _unkTable2[]
-
- int32 _samplesPerCallback;
- int32 _samplesPerCallbackRemainder;
- int32 _samplesTillCallback;
- int32 _samplesTillCallbackRemainder;
-
- int _lastProcessed;
- int8 _flagTrigger;
- int _curChannel;
- uint8 _soundTrigger;
- int _soundsPlaying;
-
- uint16 _rnd;
-
- uint8 _unkValue1;
- uint8 _unkValue2;
- uint8 _unkValue3;
- uint8 _unkValue4;
- uint8 _unkValue5;
- uint8 _unkValue6;
- uint8 _unkValue7;
- uint8 _unkValue8;
- uint8 _unkValue9;
- uint8 _unkValue10;
- uint8 _unkValue11;
- uint8 _unkValue12;
- uint8 _unkValue13;
- uint8 _unkValue14;
- uint8 _unkValue15;
- uint8 _unkValue16;
- uint8 _unkValue17;
- uint8 _unkValue18;
- uint8 _unkValue19;
- uint8 _unkValue20;
-
- int _flags;
-
- uint8 *_soundData;
-
- uint8 _soundIdTable[0x10];
- Channel _channels[10];
-
- uint8 _vibratoAndAMDepthBits;
- uint8 _rhythmSectionBits;
-
- uint8 _curRegOffset;
- uint8 _tempo;
-
- const uint8 *_tablePtr1;
- const uint8 *_tablePtr2;
-
- static const uint8 _regOffset[];
- static const uint16 _unkTable[];
- static const uint8 *_unkTable2[];
- static const uint8 _unkTable2_1[];
- static const uint8 _unkTable2_2[];
- static const uint8 _unkTable2_3[];
- static const uint8 _unkTables[][32];
-
- Copl *opl;
-};
-
-AdlibDriver::AdlibDriver(Copl *newopl)
- : opl(newopl)
-{
- setupOpcodeList();
- setupParserOpcodeTable();
-
- // _mixer = mixer;
-
- _flags = 0;
- // _adlib = makeAdlibOPL(getRate());
- // assert(_adlib);
-
- memset(_channels, 0, sizeof(_channels));
- _soundData = 0;
-
- _vibratoAndAMDepthBits = _curRegOffset = 0;
-
- _lastProcessed = _flagTrigger = _curChannel = _rhythmSectionBits = 0;
- _soundsPlaying = 0;
- _rnd = 0x1234;
-
- _tempo = 0;
- _soundTrigger = 0;
-
- _unkValue3 = 0xFF;
- _unkValue1 = _unkValue2 = _unkValue4 = _unkValue5 = 0;
- _unkValue6 = _unkValue7 = _unkValue8 = _unkValue9 = _unkValue10 = 0;
- _unkValue11 = _unkValue12 = _unkValue13 = _unkValue14 = _unkValue15 =
- _unkValue16 = _unkValue17 = _unkValue18 = _unkValue19 = _unkValue20 = 0;
-
- _tablePtr1 = _tablePtr2 = 0;
-
- // _mixer->setupPremix(this);
-
- // _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND;
- // _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND;
- _samplesTillCallback = 0;
- _samplesTillCallbackRemainder = 0;
-}
-
-AdlibDriver::~AdlibDriver() {
- // _mixer->setupPremix(0);
- // OPLDestroy(_adlib);
- // _adlib = 0;
-}
-
-int AdlibDriver::callback(int opcode, ...) {
- // lock();
- if (opcode >= _opcodesEntries || opcode < 0) {
- warning("AdlibDriver: calling unknown opcode '%d'", opcode);
- return 0;
- }
-
- debugC(9, kDebugLevelSound, "Calling opcode '%s' (%d)", _opcodeList[opcode].name, opcode);
-
- va_list args;
- va_start(args, opcode);
- int returnValue = (this->*(_opcodeList[opcode].function))(args);
- va_end(args);
- // unlock();
- return returnValue;
-}
-
-// Opcodes
-
-int AdlibDriver::snd_ret0x100(va_list &list) {
- return 0x100;
-}
-
-int AdlibDriver::snd_ret0x1983(va_list &list) {
- return 0x1983;
-}
-
-int AdlibDriver::snd_initDriver(va_list &list) {
- _lastProcessed = _soundsPlaying = 0;
- resetAdlibState();
- return 0;
-}
-
-int AdlibDriver::snd_deinitDriver(va_list &list) {
- resetAdlibState();
- return 0;
-}
-
-int AdlibDriver::snd_setSoundData(va_list &list) {
- if (_soundData) {
- delete [] _soundData;
- _soundData = 0;
- }
- _soundData = va_arg(list, uint8*);
- return 0;
-}
-
-int AdlibDriver::snd_unkOpcode1(va_list &list) {
- warning("unimplemented snd_unkOpcode1");
- return 0;
-}
-
-int AdlibDriver::snd_startSong(va_list &list) {
- int songId = va_arg(list, int);
- _flags |= 8;
- _flagTrigger = 1;
-
- uint8 *ptr = getProgram(songId);
- uint8 chan = *ptr;
-
- if ((songId << 1) != 0) {
- if (chan == 9) {
- if (_flags & 2)
- return 0;
- } else {
- if (_flags & 1)
- return 0;
- }
- }
-
- _soundIdTable[_soundsPlaying++] = songId;
- _soundsPlaying &= 0x0F;
-
- return 0;
-}
-
-int AdlibDriver::snd_unkOpcode2(va_list &list) {
- warning("unimplemented snd_unkOpcode2");
- return 0;
-}
-
-int AdlibDriver::snd_unkOpcode3(va_list &list) {
- int value = va_arg(list, int);
- int loop = value;
- if (value < 0) {
- value = 0;
- loop = 9;
- }
- loop -= value;
- ++loop;
-
- while (loop--) {
- _curChannel = value;
- Channel &channel = _channels[_curChannel];
- channel.priority = 0;
- channel.dataptr = 0;
- if (value != 9) {
- noteOff(channel);
- }
- ++value;
- }
-
- return 0;
-}
-
-int AdlibDriver::snd_readByte(va_list &list) {
- int a = va_arg(list, int);
- int b = va_arg(list, int);
- uint8 *ptr = getProgram(a) + b;
- return *ptr;
-}
-
-int AdlibDriver::snd_writeByte(va_list &list) {
- int a = va_arg(list, int);
- int b = va_arg(list, int);
- int c = va_arg(list, int);
- uint8 *ptr = getProgram(a) + b;
- uint8 oldValue = *ptr;
- *ptr = (uint8)c;
- return oldValue;
-}
-
-int AdlibDriver::snd_getSoundTrigger(va_list &list) {
- return _soundTrigger;
-}
-
-int AdlibDriver::snd_unkOpcode4(va_list &list) {
- warning("unimplemented snd_unkOpcode4");
- return 0;
-}
-
-int AdlibDriver::snd_dummy(va_list &list) {
- return 0;
-}
-
-int AdlibDriver::snd_getNullvar4(va_list &list) {
- warning("unimplemented snd_getNullvar4");
- return 0;
-}
-
-int AdlibDriver::snd_setNullvar3(va_list &list) {
- warning("unimplemented snd_setNullvar3");
- return 0;
-}
-
-int AdlibDriver::snd_setFlag(va_list &list) {
- int oldFlags = _flags;
- _flags |= va_arg(list, int);
- return oldFlags;
-}
-
-int AdlibDriver::snd_clearFlag(va_list &list) {
- int oldFlags = _flags;
- _flags &= ~(va_arg(list, int));
- return oldFlags;
-}
-
-// timer callback
-
-void AdlibDriver::callback() {
- // lock();
- --_flagTrigger;
- if (_flagTrigger < 0)
- _flags &= ~8;
- setupPrograms();
- executePrograms();
-
- uint8 temp = _unkValue3;
- _unkValue3 += _tempo;
- if (_unkValue3 < temp) {
- if (!(--_unkValue2)) {
- _unkValue2 = _unkValue1;
- ++_unkValue4;
- }
- }
- // unlock();
-}
-
-void AdlibDriver::setupPrograms() {
- while (_lastProcessed != _soundsPlaying) {
- uint8 *ptr = getProgram(_soundIdTable[_lastProcessed]);
- uint8 chan = *ptr++;
- uint8 priority = *ptr++;
-
- // Only start this sound if its priority is higher than the one
- // already playing.
-
- Channel &channel = _channels[chan];
-
- if (priority >= channel.priority) {
- initChannel(channel);
- channel.priority = priority;
- channel.dataptr = ptr;
- channel.tempo = 0xFF;
- channel.position = 0xFF;
- channel.duration = 1;
- unkOutput2(chan);
- }
-
- ++_lastProcessed;
- _lastProcessed &= 0x0F;
- }
-}
-
-// A few words on opcode parsing and timing:
-//
-// First of all, We simulate a timer callback 72 times per second. Each timeout
-// we update each channel that has something to play.
-//
-// Each channel has its own individual tempo, which is added to its position.
-// This will frequently cause the position to "wrap around" but that is
-// intentional. In fact, it's the signal to go ahead and do more stuff with
-// that channel.
-//
-// Each channel also has a duration, indicating how much time is left on the
-// its current task. This duration is decreased by one. As long as it still has
-// not reached zero, the only thing that can happen is that the note is turned
-// off depending on manual or automatic note spacing. Once the duration reaches
-// zero, a new set of musical opcodes are executed.
-//
-// An opcode is one byte, followed by a variable number of parameters. Since
-// most opcodes have at least one one-byte parameter, we read that as well. Any
-// opcode that doesn't have that one parameter is responsible for moving the
-// data pointer back again.
-//
-// If the most significant bit of the opcode is 1, it's a function; call it.
-// The opcode functions return either 0 (continue), 1 (stop) or 2 (stop, and do
-// not run the effects callbacks).
-//
-// If the most significant bit of the opcode is 0, it's a note, and the first
-// parameter is its duration. (There are cases where the duration is modified
-// but that's an exception.) The note opcode is assumed to return 1, and is the
-// last opcode unless its duration is zero.
-//
-// Finally, most of the times that the callback is called, it will invoke the
-// effects callbacks. The final opcode in a set can prevent this, if it's a
-// function and it returns anything other than 1.
-
-void AdlibDriver::executePrograms() {
- // Each channel runs its own program. There are ten channels: One for
- // each Adlib channel (0-8), plus one "control channel" (9) which is
- // the one that tells the other channels what to do.
-
- for (_curChannel = 9; _curChannel >= 0; --_curChannel) {
- int result = 1;
-
- if (!_channels[_curChannel].dataptr) {
- continue;
- }
-
- Channel &channel = _channels[_curChannel];
- if (_curChannel != 9) {
- _curRegOffset = _regOffset[_curChannel];
- }
-
- if (channel.tempoReset) {
- channel.tempo = _tempo;
- }
-
- uint8 backup = channel.position;
- channel.position += channel.tempo;
- if (channel.position < backup) {
- if (--channel.duration) {
- if (channel.duration == channel.spacing2)
- noteOff(channel);
- if (channel.duration == channel.spacing1 && _curChannel != 9)
- noteOff(channel);
- } else {
- // An opcode is not allowed to modify its own
- // data pointer except through the 'dataptr'
- // parameter. To enforce that, we have to work
- // on a copy of the data pointer.
- //
- // This fixes a subtle music bug where the
- // wrong music would play when getting the
- // quill in Kyra 1.
- uint8 *dataptr = channel.dataptr;
- while (dataptr) {
- uint8 opcode = *dataptr++;
- uint8 param = *dataptr++;
-
- if (opcode & 0x80) {
- opcode &= 0x7F;
- if (opcode >= _parserOpcodeTableSize)
- opcode = _parserOpcodeTableSize - 1;
- debugC(9, kDebugLevelSound, "Calling opcode '%s' (%d) (channel: %d)", _parserOpcodeTable[opcode].name, opcode, _curChannel);
- result = (this->*(_parserOpcodeTable[opcode].function))(dataptr, channel, param);
- channel.dataptr = dataptr;
- if (result)
- break;
- } else {
- debugC(9, kDebugLevelSound, "Note on opcode 0x%02X (duration: %d) (channel: %d)", opcode, param, _curChannel);
- setupNote(opcode, channel);
- noteOn(channel);
- setupDuration(param, channel);
- if (param) {
- channel.dataptr = dataptr;
- break;
- }
- }
- }
- }
- }
-
- if (result == 1) {
- if (channel.primaryEffect)
- (this->*(channel.primaryEffect))(channel);
- if (channel.secondaryEffect)
- (this->*(channel.secondaryEffect))(channel);
- }
- }
-}
-
-//
-
-void AdlibDriver::resetAdlibState() {
- debugC(9, kDebugLevelSound, "resetAdlibState()");
- _rnd = 0x1234;
-
- // Authorize the control of the waveforms
- writeOPL(0x01, 0x20);
-
- // Select FM music mode
- writeOPL(0x08, 0x00);
-
- // I would guess the main purpose of this is to turn off the rhythm,
- // thus allowing us to use 9 melodic voices instead of 6.
- writeOPL(0xBD, 0x00);
-
- int loop = 10;
- while (loop--) {
- if (loop != 9) {
- // Silence the channel
- writeOPL(0x40 + _regOffset[loop], 0x3F);
- writeOPL(0x43 + _regOffset[loop], 0x3F);
- }
- initChannel(_channels[loop]);
- }
-}
-
-// Old calling style: output0x388(0xABCD)
-// New calling style: writeOPL(0xAB, 0xCD)
-
-void AdlibDriver::writeOPL(byte reg, byte val) {
- opl->write(reg, val);
-}
-
-void AdlibDriver::initChannel(Channel &channel) {
- debugC(9, kDebugLevelSound, "initChannel(%lu)", (long)(&channel - _channels));
- memset(&channel.dataptr, 0, sizeof(Channel) - ((char*)&channel.dataptr - (char*)&channel));
-
- channel.tempo = 0xFF;
- channel.priority = 0;
- // normally here are nullfuncs but we set 0 for now
- channel.primaryEffect = 0;
- channel.secondaryEffect = 0;
- channel.spacing1 = 1;
-}
-
-void AdlibDriver::noteOff(Channel &channel) {
- debugC(9, kDebugLevelSound, "noteOff(%lu)", (long)(&channel - _channels));
-
- // The control channel has no corresponding Adlib channel
-
- if (_curChannel >= 9)
- return;
-
- // When the rhythm section is enabled, channels 6, 7 and 8 are special.
-
- if (_rhythmSectionBits && _curChannel >= 6)
- return;
-
- // This means the "Key On" bit will always be 0
- channel.regBx &= 0xDF;
-
- // Octave / F-Number / Key-On
- writeOPL(0xB0 + _curChannel, channel.regBx);
-}
-
-void AdlibDriver::unkOutput2(uint8 chan) {
- debugC(9, kDebugLevelSound, "unkOutput2(%d)", chan);
-
- // The control channel has no corresponding Adlib channel
-
- if (chan >= 9)
- return;
-
- // I believe this has to do with channels 6, 7, and 8 being special
- // when Adlib's rhythm section is enabled.
-
- if (_rhythmSectionBits && chan >= 6)
- return;
-
- uint8 offset = _regOffset[chan];
-
- // The channel is cleared: First the attack/delay rate, then the
- // sustain level/release rate, and finally the note is turned off.
-
- writeOPL(0x60 + offset, 0xFF);
- writeOPL(0x63 + offset, 0xFF);
-
- writeOPL(0x80 + offset, 0xFF);
- writeOPL(0x83 + offset, 0xFF);
-
- writeOPL(0xB0 + chan, 0x00);
-
- // ...and then the note is turned on again, with whatever value is
- // still lurking in the A0 + chan register, but everything else -
- // including the two most significant frequency bit, and the octave -
- // set to zero.
- //
- // This is very strange behaviour, and causes problems with the ancient
- // FMOPL code we borrowed from AdPlug. I've added a workaround. See
- // fmopl.cpp for more details.
- //
- // More recent versions of the MAME FMOPL don't seem to have this
- // problem, but cannot currently be used because of licensing and
- // performance issues.
- //
- // Ken Silverman's Adlib emulator (which can be found on his Web page -
- // http://www.advsys.net/ken - and as part of AdPlug) also seems to be
- // immune, but is apparently not as feature complete as MAME's.
-
- writeOPL(0xB0 + chan, 0x20);
-}
-
-// I believe this is a random number generator. It actually does seem to
-// generate an even distribution of almost all numbers from 0 through 65535,
-// though in my tests some numbers were never generated.
-
-uint16 AdlibDriver::getRandomNr() {
- _rnd += 0x9248;
- uint16 lowBits = _rnd & 7;
- _rnd >>= 3;
- _rnd |= (lowBits << 13);
- return _rnd;
-}
-
-void AdlibDriver::setupDuration(uint8 duration, Channel &channel) {
- debugC(9, kDebugLevelSound, "setupDuration(%d, %lu)", duration, (long)(&channel - _channels));
- if (channel.durationRandomness) {
- channel.duration = duration + (getRandomNr() & channel.durationRandomness);
- return;
- }
- if (channel.fractionalSpacing) {
- channel.spacing2 = (duration >> 3) * channel.fractionalSpacing;
- }
- channel.duration = duration;
-}
-
-// This function may or may not play the note. It's usually followed by a call
-// to noteOn(), which will always play the current note.
-
-void AdlibDriver::setupNote(uint8 rawNote, Channel &channel, bool flag) {
- debugC(9, kDebugLevelSound, "setupNote(%d, %lu)", rawNote, (long)(&channel - _channels));
-
- channel.rawNote = rawNote;
-
- int8 note = (rawNote & 0x0F) + channel.baseNote;
- int8 octave = ((rawNote + channel.baseOctave) >> 4) & 0x0F;
-
- // There are only twelve notes. If we go outside that, we have to
- // adjust the note and octave.
-
- if (note >= 12) {
- note -= 12;
- octave++;
- } else if (note < 0) {
- note += 12;
- octave--;
- }
-
- // The calculation of frequency looks quite different from the original
- // disassembly at a first glance, but when you consider that the
- // largest possible value would be 0x0246 + 0xFF + 0x47 (and that's if
- // baseFreq is unsigned), freq is still a 10-bit value, just as it
- // should be to fit in the Ax and Bx registers.
- //
- // If it were larger than that, it could have overflowed into the
- // octave bits, and that could possibly have been used in some sound.
- // But as it is now, I can't see any way it would happen.
-
- uint16 freq = _unkTable[note] + channel.baseFreq;
-
- // When called from callback 41, the behaviour is slightly different:
- // We adjust the frequency, even when channel.unk16 is 0.
-
- if (channel.unk16 || flag) {
- const uint8 *table;
-
- if (channel.unk16 >= 0) {
- table = _unkTables[(channel.rawNote & 0x0F) + 2];
- freq += table[channel.unk16];
- } else {
- table = _unkTables[channel.rawNote & 0x0F];
- freq -= table[-channel.unk16];
- }
- }
-
- channel.regAx = freq & 0xFF;
- channel.regBx = (channel.regBx & 0x20) | (octave << 2) | ((freq >> 8) & 0x03);
-
- // Keep the note on or off
- writeOPL(0xA0 + _curChannel, channel.regAx);
- writeOPL(0xB0 + _curChannel, channel.regBx);
-}
-
-void AdlibDriver::setupInstrument(uint8 regOffset, uint8 *dataptr, Channel &channel) {
- debugC(9, kDebugLevelSound, "setupInstrument(%d, %p, %lu)", regOffset, (const void *)dataptr, (long)(&channel - _channels));
- // Amplitude Modulation / Vibrato / Envelope Generator Type /
- // Keyboard Scaling Rate / Modulator Frequency Multiple
- writeOPL(0x20 + regOffset, *dataptr++);
- writeOPL(0x23 + regOffset, *dataptr++);
-
- uint8 temp = *dataptr++;
-
- // Feedback / Algorithm
-
- // It is very likely that _curChannel really does refer to the same
- // channel as regOffset, but there's only one Cx register per channel.
-
- writeOPL(0xC0 + _curChannel, temp);
-
- // The algorithm bit. I don't pretend to understand this fully, but
- // "If set to 0, operator 1 modulates operator 2. In this case,
- // operator 2 is the only one producing sound. If set to 1, both
- // operators produce sound directly. Complex sounds are more easily
- // created if the algorithm is set to 0."
-
- channel.twoChan = temp & 1;
-
- // Waveform Select
- writeOPL(0xE0 + regOffset, *dataptr++);
- writeOPL(0xE3 + regOffset, *dataptr++);
-
- channel.opLevel1 = *dataptr++;
- channel.opLevel2 = *dataptr++;
-
- // Level Key Scaling / Total Level
- writeOPL(0x40 + regOffset, calculateOpLevel1(channel));
- writeOPL(0x43 + regOffset, calculateOpLevel2(channel));
-
- // Attack Rate / Decay Rate
- writeOPL(0x60 + regOffset, *dataptr++);
- writeOPL(0x63 + regOffset, *dataptr++);
-
- // Sustain Level / Release Rate
- writeOPL(0x80 + regOffset, *dataptr++);
- writeOPL(0x83 + regOffset, *dataptr++);
-}
-
-// Apart from playing the note, this function also updates the variables for
-// primary effect 2.
-
-void AdlibDriver::noteOn(Channel &channel) {
- debugC(9, kDebugLevelSound, "noteOn(%lu)", (long)(&channel - _channels));
-
- // The "note on" bit is set, and the current note is played.
-
- channel.regBx |= 0x20;
- writeOPL(0xB0 + _curChannel, channel.regBx);
-
- int8 shift = 9 - channel.unk33;
- uint16 temp = channel.regAx | (channel.regBx << 8);
- channel.unk37 = ((temp & 0x3FF) >> shift) & 0xFF;
- channel.unk38 = channel.unk36;
-}
-
-void AdlibDriver::adjustVolume(Channel &channel) {
- debugC(9, kDebugLevelSound, "adjustVolume(%lu)", (long)(&channel - _channels));
- // Level Key Scaling / Total Level
-
- writeOPL(0x43 + _regOffset[_curChannel], calculateOpLevel2(channel));
- if (channel.twoChan)
- writeOPL(0x40 + _regOffset[_curChannel], calculateOpLevel1(channel));
-}
-
-// This is presumably only used for some sound effects, e.g. Malcolm blowing up
-// the trees in the intro (but not the effect where he "booby-traps" the big
-// tree) and turning Kallak to stone. Related functions and variables:
-//
-// update_setupPrimaryEffect1()
-// - Initialises unk29, unk30 and unk31
-// - unk29 is not further modified
-// - unk30 is not further modified, except by update_removePrimaryEffect1()
-//
-// update_removePrimaryEffect1()
-// - Deinitialises unk30
-//
-// unk29 - determines how often the notes are played
-// unk30 - modifies the frequency
-// unk31 - determines how often the notes are played
-
-void AdlibDriver::primaryEffect1(Channel &channel) {
- debugC(9, kDebugLevelSound, "Calling primaryEffect1 (channel: %d)", _curChannel);
- uint8 temp = channel.unk31;
- channel.unk31 += channel.unk29;
- if (channel.unk31 >= temp)
- return;
-
- // Initialise unk1 to the current frequency
- uint16 unk1 = ((channel.regBx & 3) << 8) | channel.regAx;
-
- // This is presumably to shift the "note on" bit so far to the left
- // that it won't be affected by any of the calculations below.
- uint16 unk2 = ((channel.regBx & 0x20) << 8) | (channel.regBx & 0x1C);
-
- int16 unk3 = (int16)channel.unk30;
-
- if (unk3 >= 0) {
- unk1 += unk3;
- if (unk1 >= 734) {
- // The new frequency is too high. Shift it down and go
- // up one octave.
- unk1 >>= 1;
- if (!(unk1 & 0x3FF))
- ++unk1;
- unk2 = (unk2 & 0xFF00) | ((unk2 + 4) & 0xFF);
- unk2 &= 0xFF1C;
- }
- } else {
- unk1 += unk3;
- if (unk1 < 388) {
- // The new frequency is too low. Shift it up and go
- // down one octave.
- unk1 <<= 1;
- if (!(unk1 & 0x3FF))
- --unk1;
- unk2 = (unk2 & 0xFF00) | ((unk2 - 4) & 0xFF);
- unk2 &= 0xFF1C;
- }
- }
-
- // Make sure that the new frequency is still a 10-bit value.
- unk1 &= 0x3FF;
-
- writeOPL(0xA0 + _curChannel, unk1 & 0xFF);
- channel.regAx = unk1 & 0xFF;
-
- // Shift down the "note on" bit again.
- uint8 value = unk1 >> 8;
- value |= (unk2 >> 8) & 0xFF;
- value |= unk2 & 0xFF;
-
- writeOPL(0xB0 + _curChannel, value);
- channel.regBx = value;
-}
-
-// This is presumably only used for some sound effects, e.g. Malcolm entering
-// and leaving Kallak's hut. Related functions and variables:
-//
-// update_setupPrimaryEffect2()
-// - Initialises unk32, unk33, unk34, unk35 and unk36
-// - unk32 is not further modified
-// - unk33 is not further modified
-// - unk34 is a countdown that gets reinitialised to unk35 on zero
-// - unk35 is based on unk34 and not further modified
-// - unk36 is not further modified
-//
-// noteOn()
-// - Plays the current note
-// - Updates unk37 with a new (lower?) frequency
-// - Copies unk36 to unk38. The unk38 variable is a countdown.
-//
-// unk32 - determines how often the notes are played
-// unk33 - modifies the frequency
-// unk34 - countdown, updates frequency on zero
-// unk35 - initialiser for unk34 countdown
-// unk36 - initialiser for unk38 countdown
-// unk37 - frequency
-// unk38 - countdown, begins playing on zero
-// unk41 - determines how often the notes are played
-//
-// Note that unk41 is never initialised. Not that it should matter much, but it
-// is a bit sloppy.
-
-void AdlibDriver::primaryEffect2(Channel &channel) {
- debugC(9, kDebugLevelSound, "Calling primaryEffect2 (channel: %d)", _curChannel);
- if (channel.unk38) {
- --channel.unk38;
- return;
- }
-
- uint8 temp = channel.unk41;
- channel.unk41 += channel.unk32;
- if (channel.unk41 < temp) {
- uint16 unk1 = channel.unk37;
- if (!(--channel.unk34)) {
- unk1 ^= 0xFFFF;
- ++unk1;
- channel.unk37 = unk1;
- channel.unk34 = channel.unk35;
- }
-
- uint16 unk2 = (channel.regAx | (channel.regBx << 8)) & 0x3FF;
- unk2 += unk1;
-
- channel.regAx = unk2 & 0xFF;
- channel.regBx = (channel.regBx & 0xFC) | (unk2 >> 8);
-
- // Octave / F-Number / Key-On
- writeOPL(0xA0 + _curChannel, channel.regAx);
- writeOPL(0xB0 + _curChannel, channel.regBx);
- }
-}
-
-// I don't know where this is used. The same operation is performed several
-// times on the current channel, using a chunk of the _soundData[] buffer for
-// parameters. The parameters are used starting at the end of the chunk.
-//
-// Since we use _curRegOffset to specify the final register, it's quite
-// unlikely that this function is ever used to play notes. It's probably only
-// used to modify the sound. Another thing that supports this idea is that it
-// can be combined with any of the effects callbacks above.
-//
-// Related functions and variables:
-//
-// update_setupSecondaryEffect1()
-// - Initialies unk18, unk19, unk20, unk21, unk22 and offset
-// - unk19 is not further modified
-// - unk20 is not further modified
-// - unk22 is not further modified
-// - offset is not further modified
-//
-// unk18 - determines how often the operation is performed
-// unk19 - determines how often the operation is performed
-// unk20 - the start index into the data chunk
-// unk21 - the current index into the data chunk
-// unk22 - the operation to perform
-// offset - the offset to the data chunk
-
-void AdlibDriver::secondaryEffect1(Channel &channel) {
- debugC(9, kDebugLevelSound, "Calling secondaryEffect1 (channel: %d)", _curChannel);
- uint8 temp = channel.unk18;
- channel.unk18 += channel.unk19;
- if (channel.unk18 < temp) {
- if (--channel.unk21 < 0) {
- channel.unk21 = channel.unk20;
- }
- writeOPL(channel.unk22 + _curRegOffset, _soundData[channel.offset + channel.unk21]);
- }
-}
-
-uint8 AdlibDriver::calculateOpLevel1(Channel &channel) {
- int8 value = channel.opLevel1 & 0x3F;
-
- if (channel.twoChan) {
- value += channel.opExtraLevel1;
- value += channel.opExtraLevel2;
- value += channel.opExtraLevel3;
- }
-
- // Preserve the scaling level bits from opLevel1
-
- return checkValue(value) | (channel.opLevel1 & 0xC0);
-}
-
-uint8 AdlibDriver::calculateOpLevel2(Channel &channel) {
- int8 value = channel.opLevel2 & 0x3F;
-
- value += channel.opExtraLevel1;
- value += channel.opExtraLevel2;
- value += channel.opExtraLevel3;
-
- // Preserve the scaling level bits from opLevel2
-
- return checkValue(value) | (channel.opLevel2 & 0xC0);
-}
-
-// parser opcodes
-
-int AdlibDriver::update_setRepeat(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.repeatCounter = value;
- return 0;
-}
-
-int AdlibDriver::update_checkRepeat(uint8 *&dataptr, Channel &channel, uint8 value) {
- ++dataptr;
- if (--channel.repeatCounter) {
- int16 add = READ_LE_UINT16(dataptr - 2);
- dataptr += add;
- }
- return 0;
-}
-
-int AdlibDriver::update_setupProgram(uint8 *&dataptr, Channel &channel, uint8 value) {
- if (value == 0xFF)
- return 0;
-
- uint8 *ptr = getProgram(value);
- uint8 chan = *ptr++;
- uint8 priority = *ptr++;
-
- Channel &channel2 = _channels[chan];
-
- if (priority >= channel2.priority) {
- _flagTrigger = 1;
- _flags |= 8;
- initChannel(channel2);
- channel2.priority = priority;
- channel2.dataptr = ptr;
- channel2.tempo = 0xFF;
- channel2.position = 0xFF;
- channel2.duration = 1;
- unkOutput2(chan);
- }
-
- return 0;
-}
-
-int AdlibDriver::update_setNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.spacing1 = value;
- return 0;
-}
-
-int AdlibDriver::update_jump(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- int16 add = READ_LE_UINT16(dataptr); dataptr += 2;
- dataptr += add;
- return 0;
-}
-
-int AdlibDriver::update_jumpToSubroutine(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- int16 add = READ_LE_UINT16(dataptr); dataptr += 2;
- channel.dataptrStack[channel.dataptrStackPos++] = dataptr;
- dataptr += add;
- return 0;
-}
-
-int AdlibDriver::update_returnFromSubroutine(uint8 *&dataptr, Channel &channel, uint8 value) {
- dataptr = channel.dataptrStack[--channel.dataptrStackPos];
- return 0;
-}
-
-int AdlibDriver::update_setBaseOctave(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.baseOctave = value;
- return 0;
-}
-
-int AdlibDriver::update_stopChannel(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.priority = 0;
- if (_curChannel != 9) {
- noteOff(channel);
- }
- dataptr = 0;
- return 2;
-}
-
-int AdlibDriver::update_playRest(uint8 *&dataptr, Channel &channel, uint8 value) {
- setupDuration(value, channel);
- noteOff(channel);
- return (value != 0);
-}
-
-int AdlibDriver::update_writeAdlib(uint8 *&dataptr, Channel &channel, uint8 value) {
- writeOPL(value, *dataptr++);
- return 0;
-}
-
-int AdlibDriver::update_setupNoteAndDuration(uint8 *&dataptr, Channel &channel, uint8 value) {
- setupNote(value, channel);
- value = *dataptr++;
- setupDuration(value, channel);
- return (value != 0);
-}
-
-int AdlibDriver::update_setBaseNote(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.baseNote = value;
- return 0;
-}
-
-int AdlibDriver::update_setupSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.unk18 = value;
- channel.unk19 = value;
- channel.unk20 = channel.unk21 = *dataptr++;
- channel.unk22 = *dataptr++;
- channel.offset = READ_LE_UINT16(dataptr); dataptr += 2;
- channel.secondaryEffect = &AdlibDriver::secondaryEffect1;
- return 0;
-}
-
-int AdlibDriver::update_stopOtherChannel(uint8 *&dataptr, Channel &channel, uint8 value) {
- Channel &channel2 = _channels[value];
- channel2.duration = 0;
- channel2.priority = 0;
- channel2.dataptr = 0;
- return 0;
-}
-
-int AdlibDriver::update_waitForEndOfProgram(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 *ptr = getProgram(value);
- uint8 chan = *ptr;
-
- if (!_channels[chan].dataptr) {
- return 0;
- }
-
- dataptr -= 2;
- return 2;
-}
-
-int AdlibDriver::update_setupInstrument(uint8 *&dataptr, Channel &channel, uint8 value) {
- setupInstrument(_curRegOffset, getInstrument(value), channel);
- return 0;
-}
-
-int AdlibDriver::update_setupPrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.unk29 = value;
- channel.unk30 = READ_BE_UINT16(dataptr);
- dataptr += 2;
- channel.primaryEffect = &AdlibDriver::primaryEffect1;
- channel.unk31 = 0xFF;
- return 0;
-}
-
-int AdlibDriver::update_removePrimaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- channel.primaryEffect = 0;
- channel.unk30 = 0;
- return 0;
-}
-
-int AdlibDriver::update_setBaseFreq(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.baseFreq = value;
- return 0;
-}
-
-int AdlibDriver::update_setupPrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.unk32 = value;
- channel.unk33 = *dataptr++;
- uint8 temp = *dataptr++;
- channel.unk34 = temp + 1;
- channel.unk35 = temp << 1;
- channel.unk36 = *dataptr++;
- channel.primaryEffect = &AdlibDriver::primaryEffect2;
- return 0;
-}
-
-int AdlibDriver::update_setPriority(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.priority = value;
- return 0;
-}
-
-int AdlibDriver::updateCallback23(uint8 *&dataptr, Channel &channel, uint8 value) {
- value >>= 1;
- _unkValue1 = _unkValue2 = value;
- _unkValue3 = 0xFF;
- _unkValue4 = _unkValue5 = 0;
- return 0;
-}
-
-int AdlibDriver::updateCallback24(uint8 *&dataptr, Channel &channel, uint8 value) {
- if (_unkValue5) {
- if (_unkValue4 & value) {
- _unkValue5 = 0;
- return 0;
- }
- }
-
- if (!(value & _unkValue4)) {
- ++_unkValue5;
- }
-
- dataptr -= 2;
- channel.duration = 1;
- return 2;
-}
-
-int AdlibDriver::update_setExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.opExtraLevel1 = value;
- adjustVolume(channel);
- return 0;
-}
-
-int AdlibDriver::update_setupDuration(uint8 *&dataptr, Channel &channel, uint8 value) {
- setupDuration(value, channel);
- return (value != 0);
-}
-
-int AdlibDriver::update_playNote(uint8 *&dataptr, Channel &channel, uint8 value) {
- setupDuration(value, channel);
- noteOn(channel);
- return (value != 0);
-}
-
-int AdlibDriver::update_setFractionalNoteSpacing(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.fractionalSpacing = value & 7;
- return 0;
-}
-
-int AdlibDriver::update_setTempo(uint8 *&dataptr, Channel &channel, uint8 value) {
- _tempo = value;
- return 0;
-}
-
-int AdlibDriver::update_removeSecondaryEffect1(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- channel.secondaryEffect = 0;
- return 0;
-}
-
-int AdlibDriver::update_setChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.tempo = value;
- return 0;
-}
-
-int AdlibDriver::update_setExtraLevel3(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.opExtraLevel3 = value;
- return 0;
-}
-
-int AdlibDriver::update_setExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value) {
- int channelBackUp = _curChannel;
-
- _curChannel = value;
- Channel &channel2 = _channels[value];
- channel2.opExtraLevel2 = *dataptr++;
- adjustVolume(channel2);
-
- _curChannel = channelBackUp;
- return 0;
-}
-
-int AdlibDriver::update_changeExtraLevel2(uint8 *&dataptr, Channel &channel, uint8 value) {
- int channelBackUp = _curChannel;
-
- _curChannel = value;
- Channel &channel2 = _channels[value];
- channel2.opExtraLevel2 += *dataptr++;
- adjustVolume(channel2);
-
- _curChannel = channelBackUp;
- return 0;
-}
-
-// Apart from initialising to zero, these two functions are the only ones that
-// modify _vibratoAndAMDepthBits.
-
-int AdlibDriver::update_setAMDepth(uint8 *&dataptr, Channel &channel, uint8 value) {
- if (value & 1)
- _vibratoAndAMDepthBits |= 0x80;
- else
- _vibratoAndAMDepthBits &= 0x7F;
-
- writeOPL(0xBD, _vibratoAndAMDepthBits);
- return 0;
-}
-
-int AdlibDriver::update_setVibratoDepth(uint8 *&dataptr, Channel &channel, uint8 value) {
- if (value & 1)
- _vibratoAndAMDepthBits |= 0x40;
- else
- _vibratoAndAMDepthBits &= 0xBF;
-
- writeOPL(0xBD, _vibratoAndAMDepthBits);
- return 0;
-}
-
-int AdlibDriver::update_changeExtraLevel1(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.opExtraLevel1 += value;
- adjustVolume(channel);
- return 0;
-}
-
-int AdlibDriver::updateCallback38(uint8 *&dataptr, Channel &channel, uint8 value) {
- int channelBackUp = _curChannel;
-
- _curChannel = value;
- Channel &channel2 = _channels[value];
- channel2.duration = channel2.priority = 0;
- channel2.dataptr = 0;
- channel2.opExtraLevel2 = 0;
-
- if (value != 9) {
- uint8 outValue = _regOffset[value];
-
- // Feedback strength / Connection type
- writeOPL(0xC0 + _curChannel, 0x00);
-
- // Key scaling level / Operator output level
- writeOPL(0x43 + outValue, 0x3F);
-
- // Sustain Level / Release Rate
- writeOPL(0x83 + outValue, 0xFF);
-
- // Key On / Octave / Frequency
- writeOPL(0xB0 + _curChannel, 0x00);
- }
-
- _curChannel = channelBackUp;
- return 0;
-}
-
-int AdlibDriver::updateCallback39(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint16 unk = *dataptr++;
- unk |= value << 8;
- unk &= getRandomNr();
-
- uint16 unk2 = ((channel.regBx & 0x1F) << 8) | channel.regAx;
- unk2 += unk;
- unk2 |= ((channel.regBx & 0x20) << 8);
-
- // Frequency
- writeOPL(0xA0 + _curChannel, unk2 & 0xFF);
-
- // Key On / Octave / Frequency
- writeOPL(0xB0 + _curChannel, (unk2 & 0xFF00) >> 8);
-
- return 0;
-}
-
-int AdlibDriver::update_removePrimaryEffect2(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- channel.primaryEffect = 0;
- return 0;
-}
-
-int AdlibDriver::updateCallback41(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.unk16 = value;
- setupNote(channel.rawNote, channel, true);
- return 0;
-}
-
-int AdlibDriver::update_resetToGlobalTempo(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- channel.tempo = _tempo;
- return 0;
-}
-
-int AdlibDriver::update_nop1(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- return 0;
-}
-
-int AdlibDriver::update_setDurationRandomness(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.durationRandomness = value;
- return 0;
-}
-
-int AdlibDriver::update_changeChannelTempo(uint8 *&dataptr, Channel &channel, uint8 value) {
- int tempo = channel.tempo + (int8)value;
-
- if (tempo <= 0)
- tempo = 1;
- else if (tempo > 255)
- tempo = 255;
-
- channel.tempo = tempo;
- return 0;
-}
-
-int AdlibDriver::updateCallback46(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 entry = *dataptr++;
- _tablePtr1 = _unkTable2[entry++];
- _tablePtr2 = _unkTable2[entry];
- if (value == 2) {
- // Frequency
- writeOPL(0xA0, _tablePtr2[0]);
- }
- return 0;
-}
-
-// TODO: This is really the same as update_nop1(), so they should be combined
-// into one single update_nop().
-
-int AdlibDriver::update_nop2(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- return 0;
-}
-
-int AdlibDriver::update_setupRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) {
- int channelBackUp = _curChannel;
- int regOffsetBackUp = _curRegOffset;
-
- _curChannel = 6;
- _curRegOffset = _regOffset[6];
-
- setupInstrument(_curRegOffset, getInstrument(value), channel);
- _unkValue6 = channel.opLevel2;
-
- _curChannel = 7;
- _curRegOffset = _regOffset[7];
-
- setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel);
- _unkValue7 = channel.opLevel1;
- _unkValue8 = channel.opLevel2;
-
- _curChannel = 8;
- _curRegOffset = _regOffset[8];
-
- setupInstrument(_curRegOffset, getInstrument(*dataptr++), channel);
- _unkValue9 = channel.opLevel1;
- _unkValue10 = channel.opLevel2;
-
- // Octave / F-Number / Key-On for channels 6, 7 and 8
-
- _channels[6].regBx = *dataptr++ & 0x2F;
- writeOPL(0xB6, _channels[6].regBx);
- writeOPL(0xA6, *dataptr++);
-
- _channels[7].regBx = *dataptr++ & 0x2F;
- writeOPL(0xB7, _channels[7].regBx);
- writeOPL(0xA7, *dataptr++);
-
- _channels[8].regBx = *dataptr++ & 0x2F;
- writeOPL(0xB8, _channels[8].regBx);
- writeOPL(0xA8, *dataptr++);
-
- _rhythmSectionBits = 0x20;
-
- _curRegOffset = regOffsetBackUp;
- _curChannel = channelBackUp;
- return 0;
-}
-
-int AdlibDriver::update_playRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) {
- // Any instrument that we want to play, and which was already playing,
- // is temporarily keyed off. Instruments that were off already, or
- // which we don't want to play, retain their old on/off status. This is
- // probably so that the instrument's envelope is played from its
- // beginning again...
-
- writeOPL(0xBD, (_rhythmSectionBits & ~(value & 0x1F)) | 0x20);
-
- // ...but since we only set the rhythm instrument bits, and never clear
- // them (until the entire rhythm section is disabled), I'm not sure how
- // useful the cleverness above is. We could perhaps simply turn off all
- // the rhythm instruments instead.
-
- _rhythmSectionBits |= value;
-
- writeOPL(0xBD, _vibratoAndAMDepthBits | 0x20 | _rhythmSectionBits);
- return 0;
-}
-
-int AdlibDriver::update_removeRhythmSection(uint8 *&dataptr, Channel &channel, uint8 value) {
- --dataptr;
- _rhythmSectionBits = 0;
-
- // All the rhythm bits are cleared. The AM and Vibrato depth bits
- // remain unchanged.
-
- writeOPL(0xBD, _vibratoAndAMDepthBits);
- return 0;
-}
-
-int AdlibDriver::updateCallback51(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 value2 = *dataptr++;
-
- if (value & 1) {
- _unkValue12 = value2;
-
- // Channel 7, op1: Level Key Scaling / Total Level
- writeOPL(0x51, checkValue(value2 + _unkValue7 + _unkValue11 + _unkValue12));
- }
-
- if (value & 2) {
- _unkValue14 = value2;
-
- // Channel 8, op2: Level Key Scaling / Total Level
- writeOPL(0x55, checkValue(value2 + _unkValue10 + _unkValue13 + _unkValue14));
- }
-
- if (value & 4) {
- _unkValue15 = value2;
-
- // Channel 8, op1: Level Key Scaling / Total Level
- writeOPL(0x52, checkValue(value2 + _unkValue9 + _unkValue16 + _unkValue15));
- }
-
- if (value & 8) {
- _unkValue18 = value2;
-
- // Channel 7, op2: Level Key Scaling / Total Level
- writeOPL(0x54, checkValue(value2 + _unkValue8 + _unkValue17 + _unkValue18));
- }
-
- if (value & 16) {
- _unkValue20 = value2;
-
- // Channel 6, op2: Level Key Scaling / Total Level
- writeOPL(0x53, checkValue(value2 + _unkValue6 + _unkValue19 + _unkValue20));
- }
-
- return 0;
-}
-
-int AdlibDriver::updateCallback52(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 value2 = *dataptr++;
-
- if (value & 1) {
- _unkValue11 = checkValue(value2 + _unkValue7 + _unkValue11 + _unkValue12);
-
- // Channel 7, op1: Level Key Scaling / Total Level
- writeOPL(0x51, _unkValue11);
- }
-
- if (value & 2) {
- _unkValue13 = checkValue(value2 + _unkValue10 + _unkValue13 + _unkValue14);
-
- // Channel 8, op2: Level Key Scaling / Total Level
- writeOPL(0x55, _unkValue13);
- }
-
- if (value & 4) {
- _unkValue16 = checkValue(value2 + _unkValue9 + _unkValue16 + _unkValue15);
-
- // Channel 8, op1: Level Key Scaling / Total Level
- writeOPL(0x52, _unkValue16);
- }
-
- if (value & 8) {
- _unkValue17 = checkValue(value2 + _unkValue8 + _unkValue17 + _unkValue18);
-
- // Channel 7, op2: Level Key Scaling / Total Level
- writeOPL(0x54, _unkValue17);
- }
-
- if (value & 16) {
- _unkValue19 = checkValue(value2 + _unkValue6 + _unkValue19 + _unkValue20);
-
- // Channel 6, op2: Level Key Scaling / Total Level
- writeOPL(0x53, _unkValue19);
- }
-
- return 0;
-}
-
-int AdlibDriver::updateCallback53(uint8 *&dataptr, Channel &channel, uint8 value) {
- uint8 value2 = *dataptr++;
-
- if (value & 1) {
- _unkValue11 = value2;
-
- // Channel 7, op1: Level Key Scaling / Total Level
- writeOPL(0x51, checkValue(value2 + _unkValue7 + _unkValue12));
- }
-
- if (value & 2) {
- _unkValue13 = value2;
-
- // Channel 8, op2: Level Key Scaling / Total Level
- writeOPL(0x55, checkValue(value2 + _unkValue10 + _unkValue14));
- }
-
- if (value & 4) {
- _unkValue16 = value2;
-
- // Channel 8, op1: Level Key Scaling / Total Level
- writeOPL(0x52, checkValue(value2 + _unkValue9 + _unkValue15));
- }
-
- if (value & 8) {
- _unkValue17 = value2;
-
- // Channel 7, op2: Level Key Scaling / Total Level
- writeOPL(0x54, checkValue(value2 + _unkValue8 + _unkValue18));
- }
-
- if (value & 16) {
- _unkValue19 = value2;
-
- // Channel 6, op2: Level Key Scaling / Total Level
- writeOPL(0x53, checkValue(value2 + _unkValue6 + _unkValue20));
- }
-
- return 0;
-}
-
-int AdlibDriver::update_setSoundTrigger(uint8 *&dataptr, Channel &channel, uint8 value) {
- _soundTrigger = value;
- return 0;
-}
-
-int AdlibDriver::update_setTempoReset(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.tempoReset = value;
- return 0;
-}
-
-int AdlibDriver::updateCallback56(uint8 *&dataptr, Channel &channel, uint8 value) {
- channel.unk39 = value;
- channel.unk40 = *dataptr++;
- return 0;
-}
-
-// static res
-
-#define COMMAND(x) { &AdlibDriver::x, #x }
-
-void AdlibDriver::setupOpcodeList() {
- static const OpcodeEntry opcodeList[] = {
- COMMAND(snd_ret0x100),
- COMMAND(snd_ret0x1983),
- COMMAND(snd_initDriver),
- COMMAND(snd_deinitDriver),
- COMMAND(snd_setSoundData),
- COMMAND(snd_unkOpcode1),
- COMMAND(snd_startSong),
- COMMAND(snd_unkOpcode2),
- COMMAND(snd_unkOpcode3),
- COMMAND(snd_readByte),
- COMMAND(snd_writeByte),
- COMMAND(snd_getSoundTrigger),
- COMMAND(snd_unkOpcode4),
- COMMAND(snd_dummy),
- COMMAND(snd_getNullvar4),
- COMMAND(snd_setNullvar3),
- COMMAND(snd_setFlag),
- COMMAND(snd_clearFlag)
- };
-
- _opcodeList = opcodeList;
- _opcodesEntries = ARRAYSIZE(opcodeList);
-}
-
-void AdlibDriver::setupParserOpcodeTable() {
- static const ParserOpcode parserOpcodeTable[] = {
- // 0
- COMMAND(update_setRepeat),
- COMMAND(update_checkRepeat),
- COMMAND(update_setupProgram),
- COMMAND(update_setNoteSpacing),
-
- // 4
- COMMAND(update_jump),
- COMMAND(update_jumpToSubroutine),
- COMMAND(update_returnFromSubroutine),
- COMMAND(update_setBaseOctave),
-
- // 8
- COMMAND(update_stopChannel),
- COMMAND(update_playRest),
- COMMAND(update_writeAdlib),
- COMMAND(update_setupNoteAndDuration),
-
- // 12
- COMMAND(update_setBaseNote),
- COMMAND(update_setupSecondaryEffect1),
- COMMAND(update_stopOtherChannel),
- COMMAND(update_waitForEndOfProgram),
-
- // 16
- COMMAND(update_setupInstrument),
- COMMAND(update_setupPrimaryEffect1),
- COMMAND(update_removePrimaryEffect1),
- COMMAND(update_setBaseFreq),
-
- // 20
- COMMAND(update_stopChannel),
- COMMAND(update_setupPrimaryEffect2),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
-
- // 24
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
- COMMAND(update_setPriority),
- COMMAND(update_stopChannel),
-
- // 28
- COMMAND(updateCallback23),
- COMMAND(updateCallback24),
- COMMAND(update_setExtraLevel1),
- COMMAND(update_stopChannel),
-
- // 32
- COMMAND(update_setupDuration),
- COMMAND(update_playNote),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
-
- // 36
- COMMAND(update_setFractionalNoteSpacing),
- COMMAND(update_stopChannel),
- COMMAND(update_setTempo),
- COMMAND(update_removeSecondaryEffect1),
-
- // 40
- COMMAND(update_stopChannel),
- COMMAND(update_setChannelTempo),
- COMMAND(update_stopChannel),
- COMMAND(update_setExtraLevel3),
-
- // 44
- COMMAND(update_setExtraLevel2),
- COMMAND(update_changeExtraLevel2),
- COMMAND(update_setAMDepth),
- COMMAND(update_setVibratoDepth),
-
- // 48
- COMMAND(update_changeExtraLevel1),
- COMMAND(update_stopChannel),
- COMMAND(update_stopChannel),
- COMMAND(updateCallback38),
-
- // 52
- COMMAND(update_stopChannel),
- COMMAND(updateCallback39),
- COMMAND(update_removePrimaryEffect2),
- COMMAND(update_stopChannel),
-
- // 56
- COMMAND(update_stopChannel),
- COMMAND(updateCallback41),
- COMMAND(update_resetToGlobalTempo),
- COMMAND(update_nop1),
-
- // 60
- COMMAND(update_setDurationRandomness),
- COMMAND(update_changeChannelTempo),
- COMMAND(update_stopChannel),
- COMMAND(updateCallback46),
-
- // 64
- COMMAND(update_nop2),
- COMMAND(update_setupRhythmSection),
- COMMAND(update_playRhythmSection),
- COMMAND(update_removeRhythmSection),
-
- // 68
- COMMAND(updateCallback51),
- COMMAND(updateCallback52),
- COMMAND(updateCallback53),
- COMMAND(update_setSoundTrigger),
-
- // 72
- COMMAND(update_setTempoReset),
- COMMAND(updateCallback56),
- COMMAND(update_stopChannel)
- };
-
- _parserOpcodeTable = parserOpcodeTable;
- _parserOpcodeTableSize = ARRAYSIZE(parserOpcodeTable);
-}
-#undef COMMAND
-
-// This table holds the register offset for operator 1 for each of the nine
-// channels. To get the register offset for operator 2, simply add 3.
-
-const uint8 AdlibDriver::_regOffset[] = {
- 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11,
- 0x12
-};
-
-// Given the size of this table, and the range of its values, it's probably the
-// F-Numbers (10 bits) for the notes of the 12-tone scale. However, it does not
-// match the table in the Adlib documentation I've seen.
-
-const uint16 AdlibDriver::_unkTable[] = {
- 0x0134, 0x0147, 0x015A, 0x016F, 0x0184, 0x019C, 0x01B4, 0x01CE, 0x01E9,
- 0x0207, 0x0225, 0x0246
-};
-
-// These tables are currently only used by updateCallback46(), which only ever
-// uses the first element of one of the sub-tables.
-
-const uint8 *AdlibDriver::_unkTable2[] = {
- AdlibDriver::_unkTable2_1,
- AdlibDriver::_unkTable2_2,
- AdlibDriver::_unkTable2_1,
- AdlibDriver::_unkTable2_2,
- AdlibDriver::_unkTable2_3,
- AdlibDriver::_unkTable2_2
-};
-
-const uint8 AdlibDriver::_unkTable2_1[] = {
- 0x50, 0x50, 0x4F, 0x4F, 0x4E, 0x4E, 0x4D, 0x4D,
- 0x4C, 0x4C, 0x4B, 0x4B, 0x4A, 0x4A, 0x49, 0x49,
- 0x48, 0x48, 0x47, 0x47, 0x46, 0x46, 0x45, 0x45,
- 0x44, 0x44, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41,
- 0x40, 0x40, 0x3F, 0x3F, 0x3E, 0x3E, 0x3D, 0x3D,
- 0x3C, 0x3C, 0x3B, 0x3B, 0x3A, 0x3A, 0x39, 0x39,
- 0x38, 0x38, 0x37, 0x37, 0x36, 0x36, 0x35, 0x35,
- 0x34, 0x34, 0x33, 0x33, 0x32, 0x32, 0x31, 0x31,
- 0x30, 0x30, 0x2F, 0x2F, 0x2E, 0x2E, 0x2D, 0x2D,
- 0x2C, 0x2C, 0x2B, 0x2B, 0x2A, 0x2A, 0x29, 0x29,
- 0x28, 0x28, 0x27, 0x27, 0x26, 0x26, 0x25, 0x25,
- 0x24, 0x24, 0x23, 0x23, 0x22, 0x22, 0x21, 0x21,
- 0x20, 0x20, 0x1F, 0x1F, 0x1E, 0x1E, 0x1D, 0x1D,
- 0x1C, 0x1C, 0x1B, 0x1B, 0x1A, 0x1A, 0x19, 0x19,
- 0x18, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15,
- 0x14, 0x14, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11,
- 0x10, 0x10
-};
-
-// no don't ask me WHY this table exsits!
-const uint8 AdlibDriver::_unkTable2_2[] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
- 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
- 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
- 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x6F,
- 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
- 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
- 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F
-};
-
-const uint8 AdlibDriver::_unkTable2_3[] = {
- 0x40, 0x40, 0x40, 0x3F, 0x3F, 0x3F, 0x3E, 0x3E,
- 0x3E, 0x3D, 0x3D, 0x3D, 0x3C, 0x3C, 0x3C, 0x3B,
- 0x3B, 0x3B, 0x3A, 0x3A, 0x3A, 0x39, 0x39, 0x39,
- 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36,
- 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x33,
- 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x31,
- 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x2F, 0x2E, 0x2E,
- 0x2E, 0x2D, 0x2D, 0x2D, 0x2C, 0x2C, 0x2C, 0x2B,
- 0x2B, 0x2B, 0x2A, 0x2A, 0x2A, 0x29, 0x29, 0x29,
- 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26,
- 0x26, 0x25, 0x25, 0x25, 0x24, 0x24, 0x24, 0x23,
- 0x23, 0x23, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21,
- 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E,
- 0x1E, 0x1D, 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1B,
- 0x1B, 0x1B, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19,
- 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16, 0x16,
- 0x16, 0x15
-};
-
-// This table is used to modify the frequency of the notes, depending on the
-// note value and unk16. In theory, we could very well try to access memory
-// outside this table, but in reality that probably won't happen.
-//
-// This could be some sort of pitch bend, but I have yet to see it used for
-// anything so it's hard to say.
-
-const uint8 AdlibDriver::_unkTables[][32] = {
- // 0
- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08,
- 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19,
- 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21 },
- // 1
- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x09,
- 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
- 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A,
- 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x22, 0x24 },
- // 2
- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x09,
- 0x0A, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13,
- 0x14, 0x15, 0x16, 0x17, 0x19, 0x1A, 0x1C, 0x1D,
- 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26 },
- // 3
- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A,
- 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x12, 0x13,
- 0x14, 0x15, 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1D,
- 0x1E, 0x1F, 0x20, 0x21, 0x23, 0x25, 0x27, 0x28 },
- // 4
- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0A,
- 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x11, 0x13, 0x15,
- 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20,
- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x2A },
- // 5
- { 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B,
- 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15,
- 0x16, 0x17, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x20,
- 0x21, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D },
- // 6
- { 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0B,
- 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15,
- 0x16, 0x17, 0x18, 0x1A, 0x1C, 0x1E, 0x21, 0x24,
- 0x25, 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30 },
- // 7
- { 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C,
- 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x18,
- 0x19, 0x1A, 0x1C, 0x1D, 0x1F, 0x21, 0x23, 0x25,
- 0x26, 0x27, 0x29, 0x2B, 0x2D, 0x2F, 0x30, 0x32 },
- // 8
- { 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0D,
- 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x14, 0x17, 0x1A,
- 0x19, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25, 0x28,
- 0x29, 0x2A, 0x2B, 0x2D, 0x2F, 0x31, 0x33, 0x35 },
- // 9
- { 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E,
- 0x0F, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1B,
- 0x1C, 0x1D, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x29,
- 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36, 0x39 },
- // 10
- { 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0E,
- 0x0F, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1E,
- 0x1F, 0x21, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2D,
- 0x2E, 0x2F, 0x31, 0x32, 0x34, 0x36, 0x39, 0x3C },
- // 11
- { 0x00, 0x01, 0x03, 0x05, 0x07, 0x0A, 0x0C, 0x0F,
- 0x10, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1E,
- 0x1F, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2E,
- 0x2F, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3C, 0x3F },
- // 12
- { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x10,
- 0x11, 0x12, 0x14, 0x16, 0x18, 0x1B, 0x1E, 0x21,
- 0x22, 0x23, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32,
- 0x33, 0x34, 0x36, 0x38, 0x3B, 0x34, 0x41, 0x44 },
- // 13
- { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x11,
- 0x12, 0x13, 0x15, 0x17, 0x1A, 0x1D, 0x20, 0x23,
- 0x24, 0x25, 0x27, 0x29, 0x2C, 0x2F, 0x32, 0x35,
- 0x36, 0x37, 0x39, 0x3B, 0x3E, 0x41, 0x44, 0x47 }
-};
-
-// #pragma mark -
-
-// At the time of writing, the only known case where Kyra 1 uses sound triggers
-// is in the castle, to cycle between three different songs.
-
-const int CadlPlayer::_kyra1SoundTriggers[] = {
- 0, 4, 5, 3
-};
-
-const int CadlPlayer::_kyra1NumSoundTriggers = ARRAYSIZE(CadlPlayer::_kyra1SoundTriggers);
-
-CadlPlayer::CadlPlayer(Copl *newopl)
- : CPlayer(newopl), numsubsongs(0), _trackEntries(), _soundDataPtr(0)
-{
- memset(_trackEntries, 0, sizeof(_trackEntries));
- _driver = new AdlibDriver(newopl);
- assert(_driver);
-
- _sfxPlayingSound = -1;
- // _soundFileLoaded = "";
-
- _soundTriggers = _kyra1SoundTriggers;
- _numSoundTriggers = _kyra1NumSoundTriggers;
-
- init();
-}
-
-CadlPlayer::~CadlPlayer() {
- delete [] _soundDataPtr;
- delete _driver;
-}
-
-bool CadlPlayer::init() {
- _driver->callback(2);
- _driver->callback(16, int(4));
- return true;
-}
-
-void CadlPlayer::process() {
- uint8 trigger = _driver->callback(11);
-
- if (trigger < _numSoundTriggers) {
- int soundId = _soundTriggers[trigger];
-
- if (soundId) {
- playTrack(soundId);
- }
- } else {
- warning("Unknown sound trigger %d", trigger);
- // TODO: At this point, we really want to clear the trigger...
- }
-}
-
-// void CadlPlayer::setVolume(int volume) {
-// }
-
-// int CadlPlayer::getVolume() {
-// return 0;
-// }
-
-// void CadlPlayer::loadMusicFile(const char *file) {
-// loadSoundFile(file);
-// }
-
-void CadlPlayer::playTrack(uint8 track) {
- play(track);
-}
-
-// void CadlPlayer::haltTrack() {
-// unk1();
-// unk2();
-// //_engine->_system->delayMillis(3 * 60);
-// }
-
-void CadlPlayer::playSoundEffect(uint8_t track) {
- play(track);
-}
-
-void CadlPlayer::play(uint8_t track) {
- uint8 soundId = _trackEntries[track];
- if ((int8)soundId == -1 || !_soundDataPtr)
- return;
- soundId &= 0xFF;
- _driver->callback(16, 0);
- // while ((_driver->callback(16, 0) & 8)) {
- // We call the system delay and not the game delay to avoid concurrency issues.
- // _engine->_system->delayMillis(10);
- // }
- if (_sfxPlayingSound != -1) {
- // Restore the sounds's normal values.
- _driver->callback(10, _sfxPlayingSound, int(1), int(_sfxPriority));
- _driver->callback(10, _sfxPlayingSound, int(3), int(_sfxFourthByteOfSong));
- _sfxPlayingSound = -1;
- }
-
- int chan = _driver->callback(9, soundId, int(0));
-
- if (chan != 9) {
- _sfxPlayingSound = soundId;
- _sfxPriority = _driver->callback(9, soundId, int(1));
- _sfxFourthByteOfSong = _driver->callback(9, soundId, int(3));
-
- // In the cases I've seen, the mysterious fourth byte has been
- // the parameter for the update_setExtraLevel3() callback.
- //
- // The extra level is part of the channels "total level", which
- // is a six-bit value where larger values means softer volume.
- //
- // So what seems to be happening here is that sounds which are
- // started by this function are given a slightly lower priority
- // and a slightly higher (i.e. softer) extra level 3 than they
- // would have if they were started from anywhere else. Strange.
-
- int newVal = ((((-_sfxFourthByteOfSong) + 63) * 0xFF) >> 8) & 0xFF;
- newVal = -newVal + 63;
- _driver->callback(10, soundId, int(3), newVal);
- newVal = ((_sfxPriority * 0xFF) >> 8) & 0xFF;
- _driver->callback(10, soundId, int(1), newVal);
- }
-
- _driver->callback(6, soundId);
-}
-
-// void CadlPlayer::beginFadeOut() {
-// playSoundEffect(1);
-// }
-
-bool CadlPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename);
-
- // file validation section
- if(!f || !fp.extension(filename, ".adl")) {
- fp.close(f);
- return false;
- }
-
- // if (_soundFileLoaded == file)
- // return;
-
- // if (_soundDataPtr) {
- // haltTrack();
- // }
-
- uint8 *file_data = 0; uint32 file_size = 0;
-
- // char filename[25];
- // sprintf(filename, "%s.ADL", file);
-
- // file_data = _engine->resource()->fileData(filename, &file_size);
- // if (!file_data) {
- // warning("Couldn't find music file: '%s'", filename);
- // return;
- // }
-
- unk2();
- unk1();
-
- file_size = fp.filesize(f);
- file_data = new uint8 [file_size];
- f->readString((char *)file_data, file_size);
-
- _driver->callback(8, int(-1));
- _soundDataPtr = 0;
-
- uint8 *p = file_data;
- memcpy(_trackEntries, p, 120*sizeof(uint8));
- p += 120;
-
- int soundDataSize = file_size - 120;
-
- _soundDataPtr = new uint8[soundDataSize];
- assert(_soundDataPtr);
-
- memcpy(_soundDataPtr, p, soundDataSize*sizeof(uint8));
-
- delete [] file_data;
- file_data = p = 0;
- file_size = 0;
-
- _driver->callback(4, _soundDataPtr);
-
- // _soundFileLoaded = file;
-
- // find last subsong
- for(int i = 119; i >= 0; i--)
- if(_trackEntries[i] != 0xff) {
- numsubsongs = i + 1;
- break;
- }
-
- fp.close(f);
- cursubsong = 2;
- rewind();
- return true;
-}
-
-void CadlPlayer::rewind(int subsong)
-{
- if(subsong == -1) subsong = cursubsong;
- opl->init();
- opl->write(1,32);
- playSoundEffect(subsong);
- cursubsong = subsong;
- update();
-}
-
-unsigned int CadlPlayer::getsubsongs()
-{
- return numsubsongs;
-}
-
-bool CadlPlayer::update()
-{
- bool songend = true;
-
-// if(_trackEntries[cursubsong] == 0xff)
-// return false;
-
- _driver->callback();
-
- for(int i = 0; i < 10; i++)
- if(_driver->_channels[i].dataptr != NULL)
- songend = false;
-
- return !songend;
-}
-
-void CadlPlayer::unk1() {
- playSoundEffect(0);
- //_engine->_system->delayMillis(5 * 60);
-}
-
-void CadlPlayer::unk2() {
- playSoundEffect(0);
-}
-
-CPlayer *CadlPlayer::factory(Copl *newopl)
-{
- return new CadlPlayer(newopl);
-}
diff --git a/src/adplug/core/adl.h b/src/adplug/core/adl.h
deleted file mode 100644
index dd5e55d..0000000
--- a/src/adplug/core/adl.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * adl.h - ADL player adaption by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_ADLPLAYER
-#define H_ADPLUG_ADLPLAYER
-
-#include <inttypes.h>
-
-#include "player.h"
-
-class AdlibDriver;
-
-class CadlPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CadlPlayer(Copl *newopl);
- ~CadlPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong = -1);
-
- // refresh rate is fixed at 72Hz
- float getrefresh()
- {
- return 72.0f;
- }
-
- unsigned int getsubsongs();
- unsigned int getsubsong() { return cursubsong; }
- std::string gettype() { return std::string("Westwood ADL"); }
-
- private:
- int numsubsongs, cursubsong;
-
- AdlibDriver *_driver;
-
- uint8_t _trackEntries[120];
- uint8_t *_soundDataPtr;
- int _sfxPlayingSound;
-
- uint8_t _sfxPriority;
- uint8_t _sfxFourthByteOfSong;
-
- int _numSoundTriggers;
- const int *_soundTriggers;
-
- static const int _kyra1NumSoundTriggers;
- static const int _kyra1SoundTriggers[];
-
- bool init();
- void process();
- void playTrack(uint8_t track);
- void playSoundEffect(uint8_t track);
- void play(uint8_t track);
- void unk1();
- void unk2();
-};
-
-#endif
diff --git a/src/adplug/core/adlibemu.cc b/src/adplug/core/adlibemu.cc
deleted file mode 100644
index 6554d97..0000000
--- a/src/adplug/core/adlibemu.cc
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * ADLIBEMU.C
- * Copyright (C) 1998-2001 Ken Silverman
- * Ken Silverman's official web site: "http://www.advsys.net/ken"
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/*
-This file is a digital Adlib emulator for OPL2 and possibly OPL3
-
-Features that could be added in a future version:
-- Amplitude and Frequency Vibrato Bits (not hard, but a big speed hit)
-- Global Keyboard Split Number Bit (need to research this one some more)
-- 2nd Adlib chip for OPL3 (simply need to make my cell array bigger)
-- Advanced connection modes of OPL3 (Just need to add more "docell" cases)
-- L/R Stereo bits of OPL3 (Need adlibgetsample to return stereo)
-
-Features that aren't worth supporting:
-- Anything related to adlib timers&interrupts (Sorry - I always used IRQ0)
-- Composite sine wave mode (CSM) (Supported only on ancient cards)
-
-I'm not sure about a few things in my code:
-- Attack curve. What function is this anyway? I chose to use an order-3
- polynomial to approximate but this doesn't seem right.
-- Attack/Decay/Release constants - my constants may not be exact
-- What should ADJUSTSPEED be?
-- Haven't verified that Global Keyboard Split Number Bit works yet
-- Some of the drums don't always sound right. It's pretty hard to guess
- the exact waveform of drums when you look at random data which is
- slightly randomized due to digital ADC recording.
-- Adlib seems to have a lot more treble than my emulator does. I'm not
- sure if this is simply unfixable due to the sound blaster's different
- filtering on FM and digital playback or if it's a serious bug in my
- code.
-*/
-
-#include <math.h>
-#include <string.h>
-#include <algorithm>
-
-using std::max;
-using std::min;
-
-#define PI 3.141592653589793
-#define MAXCELLS 18
-#define WAVPREC 2048
-
-static float AMPSCALE=(8192.0);
-#define FRQSCALE (49716/512.0)
-
-//Constants for Ken's Awe32, on a PII-266 (Ken says: Use these for KSM's!)
-#define MODFACTOR 4.0 //How much of modulator cell goes into carrier
-#define MFBFACTOR 1.0 //How much feedback goes back into modulator
-#define ADJUSTSPEED 0.75 //0<=x<=1 Simulate finite rate of change of state
-
-//Constants for Ken's Awe64G, on a P-133
-//#define MODFACTOR 4.25 //How much of modulator cell goes into carrier
-//#define MFBFACTOR 0.5 //How much feedback goes back into modulator
-//#define ADJUSTSPEED 0.85 //0<=x<=1 Simulate finite rate of change of state
-
-typedef struct
-{
- float val, t, tinc, vol, sustain, amp, mfb;
- float a0, a1, a2, a3, decaymul, releasemul;
- short *waveform;
- long wavemask;
- void (*cellfunc)(void *, float);
- unsigned char flags, dum0, dum1, dum2;
-} celltype;
-
-static long numspeakers, bytespersample;
-static float recipsamp;
-static celltype cell[MAXCELLS];
-static signed short wavtable[WAVPREC*3];
-static float kslmul[4] = {0.0,0.5,0.25,1.0};
-static float frqmul[16] = {.5,1,2,3,4,5,6,7,8,9,10,10,12,12,15,15}, nfrqmul[16];
-static unsigned char adlibreg[256], ksl[8][16];
-static unsigned char modulatorbase[9] = {0,1,2,8,9,10,16,17,18};
-static unsigned char odrumstat = 0;
-static unsigned char base2cell[22] = {0,1,2,0,1,2,0,0,3,4,5,3,4,5,0,0,6,7,8,6,7,8};
-
-float lvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on left speaker
-float rvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on right speaker
-long lplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on left speaker
-long rplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on right speaker
-
-long nlvol[9], nrvol[9];
-long nlplc[9], nrplc[9];
-long rend = 0;
-#define FIFOSIZ 256L
-static float *rptr[9], *nrptr[9];
-static float rbuf[9][FIFOSIZ*2];
-static float snd[FIFOSIZ*2];
-
-static void ftol(float f, long *a) {
- *a=f;
-}
-
-#define ctc ((celltype *)c) //A rare attempt to make code easier to read!
-void docell4 (void *c, float modulator) { }
-void docell3 (void *c, float modulator)
-{
- long i;
-
- ftol(ctc->t+modulator,&i);
- ctc->t += ctc->tinc;
- ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED;
-}
-void docell2 (void *c, float modulator)
-{
- long i;
-
- ftol(ctc->t+modulator,&i);
-
- if ((long)ctc->amp <= 0x37800000)
- {
- ctc->amp = 0;
- ctc->cellfunc = docell4;
- }
- ctc->amp *= ctc->releasemul;
-
- ctc->t += ctc->tinc;
- ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED;
-}
-void docell1 (void *c, float modulator)
-{
- long i;
-
- ftol(ctc->t+modulator,&i);
-
- if ((long)ctc->amp <= (long)ctc->sustain)
- {
- if (ctc->flags&32)
- {
- ctc->amp = ctc->sustain;
- ctc->cellfunc = docell3;
- }
- else
- ctc->cellfunc = docell2;
- }
- else
- ctc->amp *= ctc->decaymul;
-
- ctc->t += ctc->tinc;
- ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED;
-}
-void docell0 (void *c, float modulator)
-{
- long i;
-
- ftol(ctc->t+modulator,&i);
-
- ctc->amp = ((ctc->a3*ctc->amp + ctc->a2)*ctc->amp + ctc->a1)*ctc->amp + ctc->a0;
- if ((long)ctc->amp > 0x3f800000)
- {
- ctc->amp = 1;
- ctc->cellfunc = docell1;
- }
-
- ctc->t += ctc->tinc;
- ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED;
-}
-
-
-static long waveform[8] = {WAVPREC,WAVPREC>>1,WAVPREC,(WAVPREC*3)>>2,0,0,(WAVPREC*5)>>2,WAVPREC<<1};
-static long wavemask[8] = {WAVPREC-1,WAVPREC-1,(WAVPREC>>1)-1,(WAVPREC>>1)-1,WAVPREC-1,((WAVPREC*3)>>2)-1,WAVPREC>>1,WAVPREC-1};
-static long wavestart[8] = {0,WAVPREC>>1,0,WAVPREC>>2,0,0,0,WAVPREC>>3};
-static float attackconst[4] = {1/2.82624,1/2.25280,1/1.88416,1/1.59744};
-static float decrelconst[4] = {1/39.28064,1/31.41608,1/26.17344,1/22.44608};
-void cellon (long i, long j, celltype *c, unsigned char iscarrier)
-{
- long frn, oct, toff;
- float f;
-
- frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0];
- oct = ((((long)adlibreg[i+0xb0])>>2)&7);
- toff = (oct<<1) + ((frn>>9)&((frn>>8)|(((adlibreg[8]>>6)&1)^1)));
- if (!(adlibreg[j+0x20]&16)) toff >>= 2;
-
- f = pow(2.0,(adlibreg[j+0x60]>>4)+(toff>>2)-1)*attackconst[toff&3]*recipsamp;
- c->a0 = .0377*f; c->a1 = 10.73*f+1; c->a2 = -17.57*f; c->a3 = 7.42*f;
- f = -7.4493*decrelconst[toff&3]*recipsamp;
- c->decaymul = pow(2.0,f*pow(2.0,(adlibreg[j+0x60]&15)+(toff>>2)));
- c->releasemul = pow(2.0,f*pow(2.0,(adlibreg[j+0x80]&15)+(toff>>2)));
- c->wavemask = wavemask[adlibreg[j+0xe0]&7];
- c->waveform = &wavtable[waveform[adlibreg[j+0xe0]&7]];
- if (!(adlibreg[1]&0x20)) c->waveform = &wavtable[WAVPREC];
- c->t = wavestart[adlibreg[j+0xe0]&7];
- c->flags = adlibreg[j+0x20];
- c->cellfunc = docell0;
- c->tinc = (float)(frn<<oct)*nfrqmul[adlibreg[j+0x20]&15];
- c->vol = pow(2.0,((float)(adlibreg[j+0x40]&63) +
- (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14);
- c->sustain = pow(2.0,(float)(adlibreg[j+0x80]>>4) * -.5);
- if (!iscarrier) c->amp = 0;
- c->mfb = pow(2.0,((adlibreg[i+0xc0]>>1)&7)+5)*(WAVPREC/2048.0)*MFBFACTOR;
- if (!(adlibreg[i+0xc0]&14)) c->mfb = 0;
- c->val = 0;
-}
-
-//This function (and bug fix) written by Chris Moeller
-void cellfreq (signed long i, signed long j, celltype *c)
-{
- long frn, oct;
-
- frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0];
- oct = ((((long)adlibreg[i+0xb0])>>2)&7);
-
- c->tinc = (float)(frn<<oct)*nfrqmul[adlibreg[j+0x20]&15];
- c->vol = pow(2.0,((float)(adlibreg[j+0x40]&63) +
- (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14);
-}
-
-static long initfirstime = 0;
-void adlibinit (long dasamplerate, long danumspeakers, long dabytespersample)
-{
- long i, j, frn, oct;
-
- memset((void *)adlibreg,0,sizeof(adlibreg));
- memset((void *)cell,0,sizeof(celltype)*MAXCELLS);
- memset((void *)rbuf,0,sizeof(rbuf));
- rend = 0; odrumstat = 0;
-
- for(i=0;i<MAXCELLS;i++)
- {
- cell[i].cellfunc = docell4;
- cell[i].amp = 0;
- cell[i].vol = 0;
- cell[i].t = 0;
- cell[i].tinc = 0;
- cell[i].wavemask = 0;
- cell[i].waveform = &wavtable[WAVPREC];
- }
-
- numspeakers = danumspeakers;
- bytespersample = dabytespersample;
-
- recipsamp = 1.0 / (float)dasamplerate;
- for(i=15;i>=0;i--) nfrqmul[i] = frqmul[i]*recipsamp*FRQSCALE*(WAVPREC/2048.0);
-
- if (!initfirstime)
- {
- initfirstime = 1;
-
- for(i=0;i<(WAVPREC>>1);i++)
- {
- wavtable[i] =
- wavtable[(i<<1) +WAVPREC] = (signed short)(16384*sin((float)((i<<1) )*PI*2/WAVPREC));
- wavtable[(i<<1)+1+WAVPREC] = (signed short)(16384*sin((float)((i<<1)+1)*PI*2/WAVPREC));
- }
- for(i=0;i<(WAVPREC>>3);i++)
- {
- wavtable[i+(WAVPREC<<1)] = wavtable[i+(WAVPREC>>3)]-16384;
- wavtable[i+((WAVPREC*17)>>3)] = wavtable[i+(WAVPREC>>2)]+16384;
- }
-
- //[table in book]*8/3
- ksl[7][0] = 0; ksl[7][1] = 24; ksl[7][2] = 32; ksl[7][3] = 37;
- ksl[7][4] = 40; ksl[7][5] = 43; ksl[7][6] = 45; ksl[7][7] = 47;
- ksl[7][8] = 48; for(i=9;i<16;i++) ksl[7][i] = i+41;
- for(j=6;j>=0;j--)
- for(i=0;i<16;i++)
- {
- oct = (long)ksl[j+1][i]-8; if (oct < 0) oct = 0;
- ksl[j][i] = (unsigned char)oct;
- }
- }
- else
- {
- for(i=0;i<9;i++)
- {
- frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0];
- oct = ((((long)adlibreg[i+0xb0])>>2)&7);
- cell[i].tinc = (float)(frn<<oct)*nfrqmul[adlibreg[modulatorbase[i]+0x20]&15];
- }
- }
-}
-
-void adlib0 (long i, long v)
-{
- unsigned char tmp = adlibreg[i];
- adlibreg[i] = v;
-
- if (i == 0xbd)
- {
- if ((v&16) > (odrumstat&16)) //BassDrum
- {
- cellon(6,16,&cell[6],0);
- cellon(6,19,&cell[15],1);
- cell[15].vol *= 2;
- }
- if ((v&8) > (odrumstat&8)) //Snare
- {
- cellon(16,20,&cell[16],0);
- cell[16].tinc *= 2*(nfrqmul[adlibreg[17+0x20]&15] / nfrqmul[adlibreg[20+0x20]&15]);
- if (((adlibreg[20+0xe0]&7) >= 3) && ((adlibreg[20+0xe0]&7) <= 5)) cell[16].vol = 0;
- cell[16].vol *= 2;
- }
- if ((v&4) > (odrumstat&4)) //TomTom
- {
- cellon(8,18,&cell[8],0);
- cell[8].vol *= 2;
- }
- if ((v&2) > (odrumstat&2)) //Cymbal
- {
- cellon(17,21,&cell[17],0);
-
- cell[17].wavemask = wavemask[5];
- cell[17].waveform = &wavtable[waveform[5]];
- cell[17].tinc *= 16; cell[17].vol *= 2;
-
- //cell[17].waveform = &wavtable[WAVPREC]; cell[17].wavemask = 0;
- //if (((adlibreg[21+0xe0]&7) == 0) || ((adlibreg[21+0xe0]&7) == 6))
- // cell[17].waveform = &wavtable[(WAVPREC*7)>>2];
- //if (((adlibreg[21+0xe0]&7) == 2) || ((adlibreg[21+0xe0]&7) == 3))
- // cell[17].waveform = &wavtable[(WAVPREC*5)>>2];
- }
- if ((v&1) > (odrumstat&1)) //Hihat
- {
- cellon(7,17,&cell[7],0);
- if (((adlibreg[17+0xe0]&7) == 1) || ((adlibreg[17+0xe0]&7) == 4) ||
- ((adlibreg[17+0xe0]&7) == 5) || ((adlibreg[17+0xe0]&7) == 7)) cell[7].vol = 0;
- if ((adlibreg[17+0xe0]&7) == 6) { cell[7].wavemask = 0; cell[7].waveform = &wavtable[(WAVPREC*7)>>2]; }
- }
-
- odrumstat = v;
- }
- else if (((unsigned)(i-0x40) < (unsigned)22) && ((i&7) < 6))
- {
- if ((i&7) < 3) // Modulator
- cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]]);
- else // Carrier
- cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]+9]);
- }
- else if ((unsigned)(i-0xa0) < (unsigned)9)
- {
- cellfreq(i-0xa0,modulatorbase[i-0xa0],&cell[i-0xa0]);
- cellfreq(i-0xa0,modulatorbase[i-0xa0]+3,&cell[i-0xa0+9]);
- }
- else if ((unsigned)(i-0xb0) < (unsigned)9)
- {
- if ((v&32) > (tmp&32))
- {
- cellon(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0],0);
- cellon(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9],1);
- }
- else if ((v&32) < (tmp&32))
- cell[i-0xb0].cellfunc = cell[i-0xb0+9].cellfunc = docell2;
- cellfreq(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0]);
- cellfreq(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9]);
- }
-
- //outdata(i,v);
-}
-
-static void clipit8(float f,unsigned char *a) {
- f/=256.0;
- f+=128.0;
- if (f>254.5) *a=255;
- else if (f<0.5) *a=0;
- else *a=f;
-}
-
-static void clipit16(float f,short *a) {
- if (f>32766.5) *a=32767;
- else if (f<-32767.5) *a=-32768;
- else *a=f;
-}
-
-void adlibsetvolume(int i) {
- AMPSCALE=i;
-}
-
-void adlibgetsample (unsigned char *sndptr, long numbytes)
-{
- long i, j, k=0, ns, endsamples, rptrs, numsamples;
- celltype *cptr;
- float f;
- short *sndptr2=(short *)sndptr;
-
- numsamples = (numbytes>>(numspeakers+bytespersample-2));
-
- if (bytespersample == 1) f = AMPSCALE/256.0; else f = AMPSCALE;
- if (numspeakers == 1)
- {
- nlvol[0] = lvol[0]*f;
- for(i=0;i<9;i++) rptr[i] = &rbuf[0][0];
- rptrs = 1;
- }
- else
- {
- rptrs = 0;
- for(i=0;i<9;i++)
- {
- if ((!i) || (lvol[i] != lvol[i-1]) || (rvol[i] != rvol[i-1]) ||
- (lplc[i] != lplc[i-1]) || (rplc[i] != rplc[i-1]))
- {
- nlvol[rptrs] = lvol[i]*f;
- nrvol[rptrs] = rvol[i]*f;
- nlplc[rptrs] = rend-min(max(lplc[i],0L),FIFOSIZ);
- nrplc[rptrs] = rend-min(max(rplc[i],0L),FIFOSIZ);
- rptrs++;
- }
- rptr[i] = &rbuf[rptrs-1][0];
- }
- }
-
-
- //CPU time used to be somewhat less when emulator was only mono!
- // Because of no delay fifos!
-
- for(ns=0;ns<numsamples;ns+=endsamples)
- {
- endsamples = min(FIFOSIZ*2-rend,FIFOSIZ);
- endsamples = min(endsamples,numsamples-ns);
-
- for(i=0;i<9;i++)
- nrptr[i] = &rptr[i][rend];
- for(i=0;i<rptrs;i++)
- memset((void *)&rbuf[i][rend],0,endsamples*sizeof(float));
-
- if (adlibreg[0xbd]&0x20)
- {
- //BassDrum (j=6)
- if (cell[15].cellfunc != docell4)
- {
- if (adlibreg[0xc6]&1)
- {
- for(i=0;i<endsamples;i++)
- {
- (cell[15].cellfunc)((void *)&cell[15],0.0);
- nrptr[6][i] += cell[15].val;
- }
- }
- else
- {
- for(i=0;i<endsamples;i++)
- {
- (cell[6].cellfunc)((void *)&cell[6],cell[6].val*cell[6].mfb);
- (cell[15].cellfunc)((void *)&cell[15],cell[6].val*WAVPREC*MODFACTOR);
- nrptr[6][i] += cell[15].val;
- }
- }
- }
-
- //Snare/Hihat (j=7), Cymbal/TomTom (j=8)
- if ((cell[7].cellfunc != docell4) || (cell[8].cellfunc != docell4) || (cell[16].cellfunc != docell4) || (cell[17].cellfunc != docell4))
- {
- for(i=0;i<endsamples;i++)
- {
- k = k*1664525+1013904223;
- (cell[16].cellfunc)((void *)&cell[16],k&((WAVPREC>>1)-1)); //Snare
- (cell[7].cellfunc)((void *)&cell[7],k&(WAVPREC-1)); //Hihat
- (cell[17].cellfunc)((void *)&cell[17],k&((WAVPREC>>3)-1)); //Cymbal
- (cell[8].cellfunc)((void *)&cell[8],0.0); //TomTom
- nrptr[7][i] += cell[7].val + cell[16].val;
- nrptr[8][i] += cell[8].val + cell[17].val;
- }
- }
- }
- for(j=9-1;j>=0;j--)
- {
- if ((adlibreg[0xbd]&0x20) && (j >= 6) && (j < 9)) continue;
-
- cptr = &cell[j]; k = j;
- if (adlibreg[0xc0+k]&1)
- {
- if ((cptr[9].cellfunc == docell4) && (cptr->cellfunc == docell4)) continue;
- for(i=0;i<endsamples;i++)
- {
- (cptr->cellfunc)((void *)cptr,cptr->val*cptr->mfb);
- (cptr->cellfunc)((void *)&cptr[9],0);
- nrptr[j][i] += cptr[9].val + cptr->val;
- }
- }
- else
- {
- if (cptr[9].cellfunc == docell4) continue;
- for(i=0;i<endsamples;i++)
- {
- (cptr->cellfunc)((void *)cptr,cptr->val*cptr->mfb);
- (cptr[9].cellfunc)((void *)&cptr[9],cptr->val*WAVPREC*MODFACTOR);
- nrptr[j][i] += cptr[9].val;
- }
- }
- }
-
- if (numspeakers == 1)
- {
- if (bytespersample == 1)
- {
- for(i=endsamples-1;i>=0;i--)
- clipit8(nrptr[0][i]*nlvol[0],sndptr+1);
- }
- else
- {
- for(i=endsamples-1;i>=0;i--)
- clipit16(nrptr[0][i]*nlvol[0],sndptr2+i);
- }
- }
- else
- {
- memset((void *)snd,0,endsamples*sizeof(float)*2);
- for(j=0;j<rptrs;j++)
- {
- for(i=0;i<endsamples;i++)
- {
- snd[(i<<1) ] += rbuf[j][(nlplc[j]+i)&(FIFOSIZ*2-1)]*nlvol[j];
- snd[(i<<1)+1] += rbuf[j][(nrplc[j]+i)&(FIFOSIZ*2-1)]*nrvol[j];
- }
- nlplc[j] += endsamples;
- nrplc[j] += endsamples;
- }
-
- if (bytespersample == 1)
- {
- for(i=(endsamples<<1)-1;i>=0;i--)
- clipit8(snd[i],sndptr+i);
- }
- else
- {
- for(i=(endsamples<<1)-1;i>=0;i--)
- clipit16(snd[i],sndptr2+i);
- }
- }
-
- sndptr = sndptr+(numspeakers*endsamples);
- sndptr2 = sndptr2+(numspeakers*endsamples);
- rend = ((rend+endsamples)&(FIFOSIZ*2-1));
- }
-}
diff --git a/src/adplug/core/adlibemu.h b/src/adplug/core/adlibemu.h
deleted file mode 100644
index 579a1e6..0000000
--- a/src/adplug/core/adlibemu.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * ADLIBEMU.H
- * Copyright (C) 1998-2001 Ken Silverman
- * Ken Silverman's official web site: "http://www.advsys.net/ken"
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-void adlibinit(long dasamplerate,long danumspeakers,long dabytespersample);
-void adlib0(long i,long v);
-void adlibgetsample(void *sndptr,long numbytes);
-void adlibsetvolume(int i);
-void randoinsts();
-extern float lvol[9],rvol[9],lplc[9],rplc[9];
diff --git a/src/adplug/core/adplug.cc b/src/adplug/core/adplug.cc
deleted file mode 100644
index a35cb10..0000000
--- a/src/adplug/core/adplug.cc
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * adplug.cpp - CAdPlug utility class, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <cstring>
-#include <string>
-#include "binfile.h"
-
-#include "adplug.h"
-#include "debug.h"
-
-/***** Replayer includes *****/
-
-#include "hsc.h"
-#include "amd.h"
-#include "a2m.h"
-#include "imf.h"
-#include "sng.h"
-#include "adtrack.h"
-#include "bam.h"
-#include "cmf.h"
-#include "d00.h"
-#include "dfm.h"
-#include "hsp.h"
-#include "ksm.h"
-#include "mad.h"
-#include "mid.h"
-#include "mkj.h"
-#include "cff.h"
-#include "dmo.h"
-#include "s3m.h"
-#include "dtm.h"
-#include "fmc.h"
-#include "mtk.h"
-#include "rad.h"
-#include "raw.h"
-#include "sa2.h"
-#include "bmf.h"
-#include "flash.h"
-#include "hybrid.h"
-#include "hyp.h"
-#include "psi.h"
-#include "rat.h"
-#include "lds.h"
-#include "u6m.h"
-#include "rol.h"
-#include "xsm.h"
-#include "dro.h"
-#include "dro2.h"
-#include "msc.h"
-#include "rix.h"
-#include "adl.h"
-#include "jbm.h"
-
-/***** CAdPlug *****/
-
-// List of all players that come with the standard AdPlug distribution
-const CPlayerDesc CAdPlug::allplayers[] = {
- CPlayerDesc(ChscPlayer::factory, "HSC-Tracker", ".hsc\0"),
- CPlayerDesc(CsngPlayer::factory, "SNGPlay", ".sng\0"),
- CPlayerDesc(CimfPlayer::factory, "Apogee IMF", ".imf\0.wlf\0.adlib\0"),
- CPlayerDesc(Ca2mLoader::factory, "Adlib Tracker 2", ".a2m\0"),
- CPlayerDesc(CadtrackLoader::factory, "Adlib Tracker", ".sng\0"),
- CPlayerDesc(CamdLoader::factory, "AMUSIC", ".amd\0"),
- CPlayerDesc(CbamPlayer::factory, "Bob's Adlib Music", ".bam\0"),
- CPlayerDesc(CcmfPlayer::factory, "Creative Music File", ".cmf\0"),
- CPlayerDesc(Cd00Player::factory, "Packed EdLib", ".d00\0"),
- CPlayerDesc(CdfmLoader::factory, "Digital-FM", ".dfm\0"),
- CPlayerDesc(ChspLoader::factory, "HSC Packed", ".hsp\0"),
- CPlayerDesc(CksmPlayer::factory, "Ken Silverman Music", ".ksm\0"),
- CPlayerDesc(CmadLoader::factory, "Mlat Adlib Tracker", ".mad\0"),
- CPlayerDesc(CmidPlayer::factory, "MIDI", ".mid\0.sci\0.laa\0"),
- CPlayerDesc(CmkjPlayer::factory, "MKJamz", ".mkj\0"),
- CPlayerDesc(CcffLoader::factory, "Boomtracker", ".cff\0"),
- CPlayerDesc(CdmoLoader::factory, "TwinTeam", ".dmo\0"),
- CPlayerDesc(Cs3mPlayer::factory, "Scream Tracker 3", ".s3m\0"),
- CPlayerDesc(CdtmLoader::factory, "DeFy Adlib Tracker", ".dtm\0"),
- CPlayerDesc(CfmcLoader::factory, "Faust Music Creator", ".sng\0"),
- CPlayerDesc(CmtkLoader::factory, "MPU-401 Trakker", ".mtk\0"),
- CPlayerDesc(CradLoader::factory, "Reality Adlib Tracker", ".rad\0"),
- CPlayerDesc(CrawPlayer::factory, "RdosPlay RAW", ".raw\0"),
- CPlayerDesc(Csa2Loader::factory, "Surprise! Adlib Tracker", ".sat\0.sa2\0"),
- CPlayerDesc(CxadbmfPlayer::factory, "BMF Adlib Tracker", ".xad\0"),
- CPlayerDesc(CxadflashPlayer::factory, "Flash", ".xad\0"),
- CPlayerDesc(CxadhybridPlayer::factory, "Hybrid", ".xad\0"),
- CPlayerDesc(CxadhypPlayer::factory, "Hypnosis", ".xad\0"),
- CPlayerDesc(CxadpsiPlayer::factory, "PSI", ".xad\0"),
- CPlayerDesc(CxadratPlayer::factory, "rat", ".xad\0"),
- CPlayerDesc(CldsPlayer::factory, "LOUDNESS Sound System", ".lds\0"),
- CPlayerDesc(Cu6mPlayer::factory, "Ultima 6 Music", ".m\0"),
- CPlayerDesc(CrolPlayer::factory, "Adlib Visual Composer", ".rol\0"),
- CPlayerDesc(CxsmPlayer::factory, "eXtra Simple Music", ".xsm\0"),
- CPlayerDesc(CdroPlayer::factory, "DOSBox Raw OPL v0.1", ".dro\0"),
- CPlayerDesc(Cdro2Player::factory, "DOSBox Raw OPL v2.0", ".dro\0"),
- CPlayerDesc(CmscPlayer::factory, "Adlib MSC Player", ".msc\0"),
- CPlayerDesc(CrixPlayer::factory, "Softstar RIX OPL Music", ".rix\0"),
- CPlayerDesc(CadlPlayer::factory, "Westwood ADL", ".adl\0"),
- CPlayerDesc(CjbmPlayer::factory, "JBM Adlib Music", ".jbm\0"),
- CPlayerDesc()
-};
-
-const CPlayers &CAdPlug::init_players(const CPlayerDesc pd[])
-{
- static CPlayers initplayers;
- unsigned int i;
-
- for(i = 0; pd[i].factory; i++)
- initplayers.push_back(&pd[i]);
-
- return initplayers;
-}
-
-const CPlayers CAdPlug::players = CAdPlug::init_players(CAdPlug::allplayers);
-CAdPlugDatabase *CAdPlug::database = 0;
-
-CPlayer *CAdPlug::factory(const std::string &fn, Copl *opl,
- const CFileProvider &fp, const CPlayers &pl)
-{
- CPlayer *p;
- CPlayers::const_iterator i;
- unsigned int j;
-
- AdPlug_LogWrite("*** CAdPlug::factory(\"%s\",opl,fp) ***\n", fn.c_str());
-
- // Try a direct hit by file extension
- for(i = pl.begin(); i != pl.end(); i++)
- for(j = 0; (*i)->get_extension(j); j++)
- if(fp.extension(fn, (*i)->get_extension(j))) {
- AdPlug_LogWrite("Trying direct hit: %s\n", (*i)->filetype.c_str());
- if((p = (*i)->factory(opl))) {
- if(p->load(fn, fp)) {
- AdPlug_LogWrite("got it!\n");
- AdPlug_LogWrite("--- CAdPlug::factory ---\n");
- return p;
- } else
- delete p;
- }
- }
-
- // Try all players, one by one
- for(i = pl.begin(); i != pl.end(); i++) {
- AdPlug_LogWrite("Trying: %s\n", (*i)->filetype.c_str());
- if((p = (*i)->factory(opl))) {
- if(p->load(fn, fp)) {
- AdPlug_LogWrite("got it!\n");
- AdPlug_LogWrite("--- CAdPlug::factory ---\n");
- return p;
- } else
- delete p;
- }
- }
-
- // Unknown file
- AdPlug_LogWrite("End of list!\n");
- AdPlug_LogWrite("--- CAdPlug::factory ---\n");
- return 0;
-}
-
-void CAdPlug::set_database(CAdPlugDatabase *db)
-{
- database = db;
-}
-
-std::string CAdPlug::get_version()
-{
- return std::string(VERSION);
-}
diff --git a/src/adplug/core/adplug.h b/src/adplug/core/adplug.h
deleted file mode 100644
index 01b56d2..0000000
--- a/src/adplug/core/adplug.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * adplug.h - AdPlug main header file, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_ADPLUG
-#define H_ADPLUG_ADPLUG
-
-#include <string>
-
-#include "player.h"
-#include "opl.h"
-#include "fprovide.h"
-#include "players.h"
-#include "database.h"
-
-class CAdPlug
-{
- friend CPlayer::CPlayer(Copl *newopl);
-
-public:
- static const CPlayers players;
-
- static CPlayer *factory(const std::string &fn, Copl *opl,
- const CFileProvider &fp,
- const CPlayers &pl = players);
-
- static void set_database(CAdPlugDatabase *db);
- static std::string get_version();
-
-private:
- static CAdPlugDatabase *database;
- static const CPlayerDesc allplayers[];
-
- static const CPlayers &init_players(const CPlayerDesc pd[]);
-};
-
-#endif
diff --git a/src/adplug/core/adtrack.cc b/src/adplug/core/adtrack.cc
deleted file mode 100644
index cc633c2..0000000
--- a/src/adplug/core/adtrack.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * adtrack.cpp - Adlib Tracker 1.0 Loader by Simon Peter <dn.tlp@gmx.net>
- *
- * NOTES:
- * The original Adlib Tracker 1.0 is behaving a little different from the
- * official spec: The 'octave' integer from the instrument file is stored
- * "minus 1" from the actual value, underflowing from 0 to 0xffff.
- *
- * I also noticed that my player is playing everything transposed a few tones
- * higher than the original tracker. As far as i can see, my player perfectly
- * follows the official spec, so it "must" be the tracker that does something
- * wrong here...
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "adtrack.h"
-#include "debug.h"
-
-/*** Public methods ***/
-
-CPlayer *CadtrackLoader::factory(Copl *newopl)
-{
- return new CadtrackLoader(newopl);
-}
-
-bool CadtrackLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- binistream *instf;
- char note[2];
- unsigned short rwp;
- unsigned char chp, octave, pnote = 0;
- int i,j;
- AdTrackInst myinst;
-
- // file validation
- if(!fp.extension(filename, ".sng") || fp.filesize(f) != 36000)
- { fp.close(f); return false; }
-
- // check for instruments file
- std::string instfilename(filename, 0, filename.find_last_of('.'));
- instfilename += ".ins";
- AdPlug_LogWrite("CadtrackLoader::load(,\"%s\"): Checking for \"%s\"...\n",
- filename.c_str(), instfilename.c_str());
- instf = fp.open(instfilename);
- if(!instf || fp.filesize(instf) != 468) { if(instf) { fp.close(instf); } fp.close(f); return false; }
-
- // give CmodPlayer a hint on what we're up to
- realloc_patterns(1,1000,9); realloc_instruments(9); realloc_order(1);
- init_trackord(); flags = NoKeyOn;
- (*order) = 0; length = 1; restartpos = 0; bpm = 120; initspeed = 3;
-
- // load instruments from instruments file
- for(i=0;i<9;i++) {
- for(j=0;j<2;j++) {
- myinst.op[j].appampmod = instf->readInt(2);
- myinst.op[j].appvib = instf->readInt(2);
- myinst.op[j].maintsuslvl = instf->readInt(2);
- myinst.op[j].keybscale = instf->readInt(2);
- myinst.op[j].octave = instf->readInt(2);
- myinst.op[j].freqrisevollvldn = instf->readInt(2);
- myinst.op[j].softness = instf->readInt(2);
- myinst.op[j].attack = instf->readInt(2);
- myinst.op[j].decay = instf->readInt(2);
- myinst.op[j].release = instf->readInt(2);
- myinst.op[j].sustain = instf->readInt(2);
- myinst.op[j].feedback = instf->readInt(2);
- myinst.op[j].waveform = instf->readInt(2);
- }
- convert_instrument(i, &myinst);
- }
- fp.close(instf);
-
- // load file
- for(rwp=0;rwp<1000;rwp++)
- for(chp=0;chp<9;chp++) {
- // read next record
- f->readString(note, 2); octave = f->readInt(1); f->ignore();
- switch(*note) {
- case 'C': if(note[1] == '#') pnote = 2; else pnote = 1; break;
- case 'D': if(note[1] == '#') pnote = 4; else pnote = 3; break;
- case 'E': pnote = 5; break;
- case 'F': if(note[1] == '#') pnote = 7; else pnote = 6; break;
- case 'G': if(note[1] == '#') pnote = 9; else pnote = 8; break;
- case 'A': if(note[1] == '#') pnote = 11; else pnote = 10; break;
- case 'B': pnote = 12; break;
- case '\0':
- if(note[1] == '\0')
- tracks[chp][rwp].note = 127;
- else {
- fp.close(f);
- return false;
- }
- break;
- default: fp.close(f); return false;
- }
- if((*note) != '\0') {
- tracks[chp][rwp].note = pnote + (octave * 12);
- tracks[chp][rwp].inst = chp + 1;
- }
- }
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-float CadtrackLoader::getrefresh()
-{
- return 18.2f;
-}
-
-/*** Private methods ***/
-
-void CadtrackLoader::convert_instrument(unsigned int n, AdTrackInst *i)
-{
- // Carrier "Amp Mod / Vib / Env Type / KSR / Multiple" register
- inst[n].data[2] = i->op[Carrier].appampmod ? 1 << 7 : 0;
- inst[n].data[2] += i->op[Carrier].appvib ? 1 << 6 : 0;
- inst[n].data[2] += i->op[Carrier].maintsuslvl ? 1 << 5 : 0;
- inst[n].data[2] += i->op[Carrier].keybscale ? 1 << 4 : 0;
- inst[n].data[2] += (i->op[Carrier].octave + 1) & 0xffff; // Bug in original tracker
- // Modulator...
- inst[n].data[1] = i->op[Modulator].appampmod ? 1 << 7 : 0;
- inst[n].data[1] += i->op[Modulator].appvib ? 1 << 6 : 0;
- inst[n].data[1] += i->op[Modulator].maintsuslvl ? 1 << 5 : 0;
- inst[n].data[1] += i->op[Modulator].keybscale ? 1 << 4 : 0;
- inst[n].data[1] += (i->op[Modulator].octave + 1) & 0xffff; // Bug in original tracker
-
- // Carrier "Key Scaling / Level" register
- inst[n].data[10] = (i->op[Carrier].freqrisevollvldn & 3) << 6;
- inst[n].data[10] += i->op[Carrier].softness & 63;
- // Modulator...
- inst[n].data[9] = (i->op[Modulator].freqrisevollvldn & 3) << 6;
- inst[n].data[9] += i->op[Modulator].softness & 63;
-
- // Carrier "Attack / Decay" register
- inst[n].data[4] = (i->op[Carrier].attack & 0x0f) << 4;
- inst[n].data[4] += i->op[Carrier].decay & 0x0f;
- // Modulator...
- inst[n].data[3] = (i->op[Modulator].attack & 0x0f) << 4;
- inst[n].data[3] += i->op[Modulator].decay & 0x0f;
-
- // Carrier "Release / Sustain" register
- inst[n].data[6] = (i->op[Carrier].release & 0x0f) << 4;
- inst[n].data[6] += i->op[Carrier].sustain & 0x0f;
- // Modulator...
- inst[n].data[5] = (i->op[Modulator].release & 0x0f) << 4;
- inst[n].data[5] += i->op[Modulator].sustain & 0x0f;
-
- // Channel "Feedback / Connection" register
- inst[n].data[0] = (i->op[Carrier].feedback & 7) << 1;
-
- // Carrier/Modulator "Wave Select" registers
- inst[n].data[8] = i->op[Carrier].waveform & 3;
- inst[n].data[7] = i->op[Modulator].waveform & 3;
-}
diff --git a/src/adplug/core/adtrack.h b/src/adplug/core/adtrack.h
deleted file mode 100644
index 5aae820..0000000
--- a/src/adplug/core/adtrack.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * adtrack.h - Adlib Tracker 1.0 Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "protrack.h"
-
-class CadtrackLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CadtrackLoader(Copl *newopl)
- : CmodPlayer(newopl)
- { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype()
- { return std::string("Adlib Tracker 1.0"); };
- unsigned int getinstruments()
- { return 9; };
-
-private:
- enum Operators {Carrier = 1, Modulator = 0};
-
- typedef struct {
- struct {
- unsigned short appampmod, appvib, maintsuslvl, keybscale, octave,
- freqrisevollvldn, softness, attack, decay, release, sustain,
- feedback, waveform;
- } op[2];
- } AdTrackInst;
-
- void convert_instrument(unsigned int n, AdTrackInst *i);
-};
diff --git a/src/adplug/core/amd.cc b/src/adplug/core/amd.cc
deleted file mode 100644
index 3b3b33b..0000000
--- a/src/adplug/core/amd.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * amd.cpp - AMD Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "amd.h"
-#include "debug.h"
-
-CPlayer *CamdLoader::factory(Copl *newopl)
-{
- return new CamdLoader(newopl);
-}
-
-bool CamdLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- struct {
- char id[9];
- unsigned char version;
- } header;
- int i, j, k, t, numtrax, maxi = 0;
- unsigned char buf, buf2, buf3;
- const unsigned char convfx[10] = {0,1,2,9,17,11,13,18,3,14};
- const unsigned char convvol[64] = {
- 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 0xa, 0xa, 0xb,
- 0xc, 0xc, 0xd, 0xe, 0xe, 0xf, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14,
- 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21,
- 0x22, 0x23, 0x25, 0x26, 0x28, 0x29, 0x2b, 0x2d, 0x2e, 0x30, 0x32, 0x35,
- 0x37, 0x3a, 0x3c, 0x3f
- };
-
- // file validation section
- if(fp.filesize(f) < 1072) { fp.close(f); return false; }
- f->seek(1062); f->readString(header.id, 9);
- header.version = f->readInt(1);
- if(strncmp(header.id, "<o\xefQU\xeeRoR", 9) &&
- strncmp(header.id, "MaDoKaN96", 9)) { fp.close(f); return false; }
-
- // load section
- memset(inst, 0, sizeof(*inst));
- f->seek(0);
- f->readString(songname, sizeof(songname));
- f->readString(author, sizeof(author));
- for(i = 0; i < 26; i++) {
- f->readString(instname[i], 23);
- for(j = 0; j < 11; j++) inst[i].data[j] = f->readInt(1);
- }
- length = f->readInt(1); nop = f->readInt(1) + 1;
- for(i=0;i<128;i++) order[i] = f->readInt(1);
- f->seek(10, binio::Add);
- if(header.version == 0x10) { // unpacked module
- maxi = nop * 9;
- for(i=0;i<64*9;i++)
- trackord[i/9][i%9] = i+1;
- t = 0;
- while(!f->ateof()) {
- for(j=0;j<64;j++)
- for(i=t;i<t+9;i++) {
- buf = f->readInt(1);
- tracks[i][j].param2 = (buf&127) % 10;
- tracks[i][j].param1 = (buf&127) / 10;
- buf = f->readInt(1);
- tracks[i][j].inst = buf >> 4;
- tracks[i][j].command = buf & 0x0f;
- buf = f->readInt(1);
- if(buf >> 4) // fix bug in AMD save routine
- tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4);
- else
- tracks[i][j].note = 0;
- tracks[i][j].inst += (buf & 1) << 4;
- }
- t += 9;
- }
- } else { // packed module
- for(i=0;i<nop;i++)
- for(j=0;j<9;j++)
- trackord[i][j] = f->readInt(2) + 1;
- numtrax = f->readInt(2);
- for(k=0;k<numtrax;k++) {
- i = f->readInt(2);
- if(i > 575) i = 575; // fix corrupted modules
- maxi = (i + 1 > maxi ? i + 1 : maxi);
- j = 0;
- do {
- buf = f->readInt(1);
- if(buf & 128) {
- for(t = j; t < j + (buf & 127) && t < 64; t++) {
- tracks[i][t].command = 0;
- tracks[i][t].inst = 0;
- tracks[i][t].note = 0;
- tracks[i][t].param1 = 0;
- tracks[i][t].param2 = 0;
- }
- j += buf & 127;
- continue;
- }
- tracks[i][j].param2 = buf % 10;
- tracks[i][j].param1 = buf / 10;
- buf = f->readInt(1);
- tracks[i][j].inst = buf >> 4;
- tracks[i][j].command = buf & 0x0f;
- buf = f->readInt(1);
- if(buf >> 4) // fix bug in AMD save routine
- tracks[i][j].note = ((buf & 14) >> 1) * 12 + (buf >> 4);
- else
- tracks[i][j].note = 0;
- tracks[i][j].inst += (buf & 1) << 4;
- j++;
- } while(j<64);
- }
- }
- fp.close(f);
-
- // convert to protracker replay data
- bpm = 50; restartpos = 0; flags = Decimal;
- for(i=0;i<26;i++) { // convert instruments
- buf = inst[i].data[0];
- buf2 = inst[i].data[1];
- inst[i].data[0] = inst[i].data[10];
- inst[i].data[1] = buf;
- buf = inst[i].data[2];
- inst[i].data[2] = inst[i].data[5];
- buf3 = inst[i].data[3];
- inst[i].data[3] = buf;
- buf = inst[i].data[4];
- inst[i].data[4] = inst[i].data[7];
- inst[i].data[5] = buf3;
- buf3 = inst[i].data[6];
- inst[i].data[6] = inst[i].data[8];
- inst[i].data[7] = buf;
- inst[i].data[8] = inst[i].data[9];
- inst[i].data[9] = buf2;
- inst[i].data[10] = buf3;
- for(j=0;j<23;j++) // convert names
- if(instname[i][j] == '\xff')
- instname[i][j] = '\x20';
- }
- for(i=0;i<maxi;i++) // convert patterns
- for(j=0;j<64;j++) {
- tracks[i][j].command = convfx[tracks[i][j].command];
- // extended command
- if(tracks[i][j].command == 14) {
- if(tracks[i][j].param1 == 2) {
- tracks[i][j].command = 10;
- tracks[i][j].param1 = tracks[i][j].param2;
- tracks[i][j].param2 = 0;
- }
-
- if(tracks[i][j].param1 == 3) {
- tracks[i][j].command = 10;
- tracks[i][j].param1 = 0;
- }
- }
-
- // fix volume
- if(tracks[i][j].command == 17) {
- int vol = convvol[tracks[i][j].param1 * 10 + tracks[i][j].param2];
-
- if(vol > 63) vol = 63;
- tracks[i][j].param1 = vol / 10;
- tracks[i][j].param2 = vol % 10;
- }
- }
-
- rewind(0);
- return true;
-}
-
-float CamdLoader::getrefresh()
-{
- if(tempo)
- return (float) (tempo);
- else
- return 18.2f;
-}
diff --git a/src/adplug/core/amd.h b/src/adplug/core/amd.h
deleted file mode 100644
index b4b053a..0000000
--- a/src/adplug/core/amd.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * amd.h - AMD Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "protrack.h"
-
-class CamdLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CamdLoader(Copl *newopl)
- : CmodPlayer(newopl)
- { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype()
- { return std::string("AMUSIC Adlib Tracker"); };
- std::string gettitle()
- { return std::string(songname,0,24); };
- std::string getauthor()
- { return std::string(author,0,24); };
- unsigned int getinstruments()
- { return 26; };
- std::string getinstrument(unsigned int n)
- { return std::string(instname[n],0,23); };
-
-private:
- char songname[24],author[24],instname[26][23];
-};
diff --git a/src/adplug/core/bam.cc b/src/adplug/core/bam.cc
deleted file mode 100644
index 46a879e..0000000
--- a/src/adplug/core/bam.cc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * bam.cpp - Bob's Adlib Music Player, by Simon Peter <dn.tlp@gmx.net>
- *
- * NOTES:
- * In my player, the loop counter is stored with the label. This can be
- * dangerous for some situations (see below), but there shouldn't be any BAM
- * files triggering this situation.
- *
- * From SourceForge Bug #476088:
- * -----------------------------
- * Using just one loop counter for each label, my player can't
- * handle files that loop twice to the same label (if that's at
- * all possible with BAM). Imagine the following situation:
- *
- * ... [*] ---- [<- *] ---- [<- *] ...
- * ^ ^ ^ ^ ^ ^ ^
- * | | | | | | |
- * +---|----+-----|-----+-----|----+--- normal song data
- * +----------|-----------|-------- label 1
- * +-----------+-------- loop points to label 1
- *
- * both loop points loop to the same label. Storing the loop
- * count with the label would cause chaos with the counter,
- * when the player executes the inner jump.
- * ------------------
- * Not to worry. my reference implementation of BAM does not
- * support the multiple loop situation you describe, and
- * neither do any BAM-creation programs. Then both loops point
- * to the same label, the inner loop's counter is just allowed
- * to clobber the outer loop's counter. No stack is neccisary.
- */
-
-#include <string.h>
-#include "bam.h"
-
-const unsigned short CbamPlayer::freq[] = {172,182,193,205,217,230,243,258,274,
-290,307,326,345,365,387,410,435,460,489,517,547,580,614,651,1369,1389,1411,
-1434,1459,1484,1513,1541,1571,1604,1638,1675,2393,2413,2435,2458,2483,2508,
-2537,2565,2595,2628,2662,2699,3417,3437,3459,3482,3507,3532,3561,3589,3619,
-3652,3686,3723,4441,4461,4483,4506,4531,4556,4585,4613,4643,4676,4710,4747,
-5465,5485,5507,5530,5555,5580,5609,5637,5667,5700,5734,5771,6489,6509,6531,
-6554,6579,6604,6633,6661,6691,6724,6758,6795,7513,7533,7555,7578,7603,7628,
-7657,7685,7715,7748,7782,7819,7858,7898,7942,7988,8037,8089,8143,8191,8191,
-8191,8191,8191,8191,8191,8191,8191,8191,8191,8191};
-
-CPlayer *CbamPlayer::factory(Copl *newopl)
-{
- return new CbamPlayer(newopl);
-}
-
-bool CbamPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[4];
- unsigned int i;
-
- size = fp.filesize(f) - 4; // filesize minus header
- f->readString(id, 4);
- if(strncmp(id,"CBMF",4)) { fp.close(f); return false; }
-
- song = new unsigned char [size];
- for(i = 0; i < size; i++) song[i] = f->readInt(1);
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CbamPlayer::update()
-{
- unsigned char cmd,c;
-
- if(del) {
- del--;
- return !songend;
- }
-
- if(pos >= size) { // EOF detection
- pos = 0;
- songend = true;
- }
-
- while(song[pos] < 128) {
- cmd = song[pos] & 240;
- c = song[pos] & 15;
- switch(cmd) {
- case 0: // stop song
- pos = 0;
- songend = true;
- break;
- case 16: // start note
- if(c < 9) {
- opl->write(0xa0 + c, freq[song[++pos]] & 255);
- opl->write(0xb0 + c, (freq[song[pos]] >> 8) + 32);
- } else
- pos++;
- pos++;
- break;
- case 32: // stop note
- if(c < 9)
- opl->write(0xb0 + c, 0);
- pos++;
- break;
- case 48: // define instrument
- if(c < 9) {
- opl->write(0x20 + op_table[c],song[pos+1]);
- opl->write(0x23 + op_table[c],song[pos+2]);
- opl->write(0x40 + op_table[c],song[pos+3]);
- opl->write(0x43 + op_table[c],song[pos+4]);
- opl->write(0x60 + op_table[c],song[pos+5]);
- opl->write(0x63 + op_table[c],song[pos+6]);
- opl->write(0x80 + op_table[c],song[pos+7]);
- opl->write(0x83 + op_table[c],song[pos+8]);
- opl->write(0xe0 + op_table[c],song[pos+9]);
- opl->write(0xe3 + op_table[c],song[pos+10]);
- opl->write(0xc0 + c,song[pos+11]);
- }
- pos += 12;
- break;
- case 80: // set label
- label[c].target = ++pos;
- label[c].defined = true;
- break;
- case 96: // jump
- if(label[c].defined)
- switch(song[pos+1]) {
- case 254: // infinite loop
- if(label[c].defined) {
- pos = label[c].target;
- songend = true;
- break;
- }
- // fall through...
- case 255: // chorus
- if(!chorus && label[c].defined) {
- chorus = true;
- gosub = pos + 2;
- pos = label[c].target;
- break;
- }
- // fall through...
- case 0: // end of loop
- pos += 2;
- break;
- default: // finite loop
- if(!label[c].count) { // loop elapsed
- label[c].count = 255;
- pos += 2;
- break;
- }
- if(label[c].count < 255) // loop defined
- label[c].count--;
- else // loop undefined
- label[c].count = song[pos+1] - 1;
- pos = label[c].target;
- break;
- }
- break;
- case 112: // end of chorus
- if(chorus) {
- pos = gosub;
- chorus = false;
- } else
- pos++;
- break;
- default: // reserved command (skip)
- pos++;
- break;
- }
- }
- if(song[pos] >= 128) { // wait
- del = song[pos] - 127;
- pos++;
- }
- return !songend;
-}
-
-void CbamPlayer::rewind(int subsong)
-{
- int i;
-
- pos = 0; songend = false; del = 0; gosub = 0; chorus = false;
- memset(label, 0, sizeof(label)); label[0].defined = true;
- for(i = 0; i < 16; i++) label[i].count = 255; // 255 = undefined
- opl->init(); opl->write(1,32);
-}
diff --git a/src/adplug/core/bam.h b/src/adplug/core/bam.h
deleted file mode 100644
index d5c2287..0000000
--- a/src/adplug/core/bam.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * bam.h - Bob's Adlib Music Player, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CbamPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CbamPlayer(Copl *newopl)
- : CPlayer(newopl), song(0)
- { };
- ~CbamPlayer()
- { if(song) delete [] song; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh()
- { return 25.0f; };
-
- std::string gettype()
- { return std::string("Bob's Adlib Music"); };
-
-private:
- static const unsigned short freq[];
-
- unsigned char *song, del;
- unsigned long pos, size, gosub;
- bool songend, chorus;
-
- struct {
- unsigned long target;
- bool defined;
- unsigned char count;
- } label[16];
-};
diff --git a/src/adplug/core/bmf.cc b/src/adplug/core/bmf.cc
deleted file mode 100644
index b3601de..0000000
--- a/src/adplug/core/bmf.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003, 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] BMF player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : GAMESNET.COM
- type : GamesNet advertising intro
- tune : by (?)The Brain [Razor 1911]
- player : ver.0.9b by Hammer
-
- file(s) : 2FAST4U.COM
- type : Ford Knox BBStro
- tune : by The Brain [Razor 1911]
- player : ver.1.1 by ?
- comment : in original player at 9th channel the feedback adlib register is not C8 but C6.
-
- file(s) : DATURA.COM
- type : Datura BBStro
- tune : by The Brain [Razor 1911]
- player : ver.1.2 by ?
- comment : inaccurate replaying, because constant outport; in original player it can be 380 or 382.
-*/
-
-#include <cstring>
-#include "bmf.h"
-#include "debug.h"
-
-const unsigned char CxadbmfPlayer::bmf_adlib_registers[117] =
-{
- 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xA0, 0xB0, 0xC0, 0xE0, 0xE3,
- 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xA1, 0xB1, 0xC1, 0xE1, 0xE4,
- 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xA2, 0xB2, 0xC2, 0xE2, 0xE5,
- 0x28, 0x2B, 0x48, 0x4B, 0x68, 0x6B, 0x88, 0x8B, 0xA3, 0xB3, 0xC3, 0xE8, 0xEB,
- 0x29, 0x2C, 0x49, 0x4C, 0x69, 0x6C, 0x89, 0x8C, 0xA4, 0xB4, 0xC4, 0xE9, 0xEC,
- 0x2A, 0x2D, 0x4A, 0x4D, 0x6A, 0x6D, 0x8A, 0x8D, 0xA5, 0xB5, 0xC5, 0xEA, 0xED,
- 0x30, 0x33, 0x50, 0x53, 0x70, 0x73, 0x90, 0x93, 0xA6, 0xB6, 0xC6, 0xF0, 0xF3,
- 0x31, 0x34, 0x51, 0x54, 0x71, 0x74, 0x91, 0x94, 0xA7, 0xB7, 0xC7, 0xF1, 0xF4,
- 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xA8, 0xB8, 0xC8, 0xF2, 0xF5
-};
-
-const unsigned short CxadbmfPlayer::bmf_notes[12] =
-{
- 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287
-};
-
-/* for 1.1 */
-const unsigned short CxadbmfPlayer::bmf_notes_2[12] =
-{
- 0x159, 0x16D, 0x183, 0x19A, 0x1B2, 0x1CC, 0x1E8, 0x205, 0x223, 0x244, 0x267, 0x28B
-};
-
-const unsigned char CxadbmfPlayer::bmf_default_instrument[13] =
-{
- 0x01, 0x01, 0x3F, 0x3F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-CPlayer *CxadbmfPlayer::factory(Copl *newopl)
-{
- return new CxadbmfPlayer(newopl);
-}
-
-bool CxadbmfPlayer::xadplayer_load()
-{
- unsigned short ptr = 0;
- int i;
-
- if(xad.fmt != BMF)
- return false;
-
-#ifdef DEBUG
- AdPlug_LogWrite("\nbmf_load():\n\n");
-#endif
- if (!strncmp((char *)&tune[0],"BMF1.2",6))
- {
- bmf.version = BMF1_2;
- bmf.timer = 70.0f;
- }
- else if (!strncmp((char *)&tune[0],"BMF1.1",6))
- {
- bmf.version = BMF1_1;
- bmf.timer = 60.0f;
- }
- else
- {
- bmf.version = BMF0_9B;
- bmf.timer = 18.2f;
- }
-
- // copy title & author
- if (bmf.version > BMF0_9B)
- {
- ptr = 6;
-
- strncpy(bmf.title,(char *)&tune[ptr],36);
- bmf.title[35] = 0;
-
- while (tune[ptr]) { ptr++; }
- ptr++;
-
- strncpy(bmf.author,(char *)&tune[ptr],36);
- bmf.author[35] = 0;
-
- while (tune[ptr]) { ptr++; }
- ptr++;
- }
- else
- {
- strncpy(bmf.title,xad.title,36);
- strncpy(bmf.author,xad.author,36);
- }
-
- // speed
- if (bmf.version > BMF0_9B)
- bmf.speed = tune[ptr++];
- else
- bmf.speed = ((tune[ptr++] << 8) / 3) >> 8; // strange, yeh ?
-
- // load instruments
- if (bmf.version > BMF0_9B)
- {
- unsigned long iflags = (tune[ptr] << 24) | (tune[ptr+1] << 16) | (tune[ptr+2] << 8) | tune[ptr+3];
- ptr+=4;
-
- for(i=0;i<32;i++)
- if (iflags & (1 << (31-i)))
- {
- strcpy(bmf.instruments[i].name, (char *)&tune[ptr]);
- memcpy(bmf.instruments[i].data, &tune[ptr+11], 13);
- ptr += 24;
- }
- else
- {
- bmf.instruments[i].name[0] = 0;
-
- if (bmf.version == BMF1_1)
- for(int j=0;j<13;j++)
- bmf.instruments[i].data[j] = bmf_default_instrument[j];
- else
- for(int j=0;j<13;j++)
- bmf.instruments[i].data[j] = 0;
- }
- }
- else
- {
- ptr = 6;
-
- for(i=0;i<32;i++)
- {
- bmf.instruments[i].name[0] = 0;
- memcpy(bmf.instruments[tune[ptr]].data, &tune[ptr+2],13); // bug no.1 (no instrument-table-end detection)
- ptr+=15;
- }
- }
-
- // load streams
- if (bmf.version > BMF0_9B)
- {
- unsigned long sflags = (tune[ptr] << 24) | (tune[ptr+1] << 16) | (tune[ptr+2] << 8) | tune[ptr+3];
- ptr+=4;
-
- for(i=0;i<9;i++)
- if (sflags & (1 << (31-i)))
- ptr+=__bmf_convert_stream(&tune[ptr],i);
- else
- bmf.streams[i][0].cmd = 0xFF;
- }
- else
- {
- for(i=0;i<tune[5];i++)
- ptr+=__bmf_convert_stream(&tune[ptr],i);
-
- for(i=tune[5];i<9;i++)
- bmf.streams[i][0].cmd = 0xFF;
- }
-
- return true;
-}
-
-void CxadbmfPlayer::xadplayer_rewind(int subsong)
-{
- int i,j;
-
- for(i=0; i<9; i++)
- {
- bmf.channel[i].stream_position = 0;
- bmf.channel[i].delay = 0;
- bmf.channel[i].loop_position = 0;
- bmf.channel[i].loop_counter = 0;
- }
-
- plr.speed = bmf.speed;
-#ifdef DEBUG
- AdPlug_LogWrite("speed: %x\n",plr.speed);
-#endif
-
- bmf.active_streams = 9;
-
- // OPL initialization
- if (bmf.version > BMF0_9B)
- {
- opl_write(0x01, 0x20);
-
- /* 1.1 */
- if (bmf.version == BMF1_1)
- for(i=0;i<9;i++)
- for(j=0;j<13;j++)
- opl_write(bmf_adlib_registers[13*i+j], bmf_default_instrument[j]);
- /* 1.2 */
- else if (bmf.version == BMF1_2)
- for(i=0x20; i<0x100; i++)
- opl_write(i,0xFF); // very interesting, really!
- }
-
- /* ALL */
-
- opl_write(0x08, 0x00);
- opl_write(0xBD, 0xC0);
-}
-
-void CxadbmfPlayer::xadplayer_update()
-{
- for(int i=0;i<9;i++)
- if (bmf.channel[i].stream_position != 0xFFFF)
- {
- if (bmf.channel[i].delay)
- bmf.channel[i].delay--;
- else
- {
-#ifdef DEBUG
- AdPlug_LogWrite("channel %02X:\n", i);
-#endif
- bmf_event event;
-
- // process so-called cross-events
- while (true)
- {
- memcpy(&event, &bmf.streams[i][bmf.channel[i].stream_position], sizeof(bmf_event));
-#ifdef DEBUG
- AdPlug_LogWrite("%02X %02X %02X %02X %02X %02X\n",
- event.note,event.delay,event.volume,event.instrument,
- event.cmd,event.cmd_data);
-#endif
-
- if (event.cmd == 0xFF)
- {
- bmf.channel[i].stream_position = 0xFFFF;
- bmf.active_streams--;
- break;
- }
- else if (event.cmd == 0xFE)
- {
- bmf.channel[i].loop_position = bmf.channel[i].stream_position+1;
- bmf.channel[i].loop_counter = event.cmd_data;
- }
- else if (event.cmd == 0xFD)
- {
- if (bmf.channel[i].loop_counter)
- {
- bmf.channel[i].stream_position = bmf.channel[i].loop_position-1;
- bmf.channel[i].loop_counter--;
- }
- }
- else
- break;
-
- bmf.channel[i].stream_position++;
- } // while (true)
-
- // process normal event
- unsigned short pos = bmf.channel[i].stream_position;
-
- if (pos != 0xFFFF)
- {
- bmf.channel[i].delay = bmf.streams[i][pos].delay;
-
- // command ?
- if (bmf.streams[i][pos].cmd)
- {
- unsigned char cmd = bmf.streams[i][pos].cmd;
-
- // 0x01: Set Modulator Volume
- if (cmd == 0x01)
- {
- unsigned char reg = bmf_adlib_registers[13*i+2];
-
- opl_write(reg, (adlib[reg] | 0x3F) - bmf.streams[i][pos].cmd_data);
- }
- // 0x10: Set Speed
- else if (cmd == 0x10)
- {
- plr.speed = bmf.streams[i][pos].cmd_data;
- plr.speed_counter = plr.speed;
- }
- } // if (bmf.streams[i][pos].cmd)
-
- // instrument ?
- if (bmf.streams[i][pos].instrument)
- {
- unsigned char ins = bmf.streams[i][pos].instrument-1;
-
- if (bmf.version != BMF1_1)
- opl_write(0xB0+i, adlib[0xB0+i] & 0xDF);
-
- for(int j=0;j<13;j++)
- opl_write(bmf_adlib_registers[i*13+j], bmf.instruments[ins].data[j]);
- } // if (bmf.streams[i][pos].instrument)
-
- // volume ?
- if (bmf.streams[i][pos].volume)
- {
- unsigned char vol = bmf.streams[i][pos].volume-1;
- unsigned char reg = bmf_adlib_registers[13*i+3];
-
- opl_write(reg, (adlib[reg] | 0x3F) - vol);
- } // if (bmf.streams[i][pos].volume)
-
- // note ?
- if (bmf.streams[i][pos].note)
- {
- unsigned short note = bmf.streams[i][pos].note;
- unsigned short freq = 0;
-
- // mute channel
- opl_write(0xB0+i, adlib[0xB0+i] & 0xDF);
-
- // get frequency
- if (bmf.version == BMF1_1)
- {
- if (note <= 0x60)
- freq = bmf_notes_2[--note % 12];
- }
- else
- {
- if (note != 0x7F)
- freq = bmf_notes[--note % 12];
- }
-
- // play note
- if (freq)
- {
- opl_write(0xB0+i, (freq >> 8) | ((note / 12) << 2) | 0x20);
- opl_write(0xA0+i, freq & 0xFF);
- }
- } // if (bmf.streams[i][pos].note)
-
- bmf.channel[i].stream_position++;
- } // if (pos != 0xFFFF)
-
- } // if (!bmf.channel[i].delay)
- } // if (bmf.channel[i].stream_position != 0xFFFF)
-
- // is module loop ?
- if (!bmf.active_streams)
- {
- for(int j=0;j<9;j++)
- bmf.channel[j].stream_position = 0;
-
- bmf.active_streams = 9;
-
- plr.looping = 1;
- }
-}
-
-float CxadbmfPlayer::xadplayer_getrefresh()
-{
- return bmf.timer;
-}
-
-std::string CxadbmfPlayer::xadplayer_gettype()
-{
- return std::string("xad: BMF Adlib Tracker");
-}
-
-std::string CxadbmfPlayer::xadplayer_gettitle()
-{
- return std::string(bmf.title);
-}
-
-std::string CxadbmfPlayer::xadplayer_getauthor()
-{
- return std::string(bmf.author);
-}
-
-unsigned int CxadbmfPlayer::xadplayer_getinstruments()
-{
- return 32;
-}
-
-std::string CxadbmfPlayer::xadplayer_getinstrument(unsigned int i)
-{
- return std::string(bmf.instruments[i].name);
-}
-
-/* -------- Internal Functions ---------------------------- */
-
-int CxadbmfPlayer::__bmf_convert_stream(unsigned char *stream, int channel)
-{
-#ifdef DEBUG
- AdPlug_LogWrite("channel %02X (note,delay,volume,instrument,command,command_data):\n",channel);
- unsigned char *last = stream;
-#endif
- unsigned char *stream_start = stream;
-
- int pos = 0;
-
- while (true)
- {
- memset(&bmf.streams[channel][pos], 0, sizeof(bmf_event));
-
- bool is_cmd = false;
-
- if (*stream == 0xFE)
- {
- // 0xFE -> 0xFF: End of Stream
- bmf.streams[channel][pos].cmd = 0xFF;
-
- stream++;
-
- break;
- }
- else if (*stream == 0xFC)
- {
- // 0xFC -> 0xFE xx: Save Loop Position
- bmf.streams[channel][pos].cmd = 0xFE;
- bmf.streams[channel][pos].cmd_data = (*(stream+1) & ((bmf.version == BMF0_9B) ? 0x7F : 0x3F)) - 1;
-
- stream+=2;
- }
- else if (*stream == 0x7D)
- {
- // 0x7D -> 0xFD: Loop Saved Position
- bmf.streams[channel][pos].cmd = 0xFD;
-
- stream++;
- }
- else
- {
- if (*stream & 0x80)
- {
- if (*(stream+1) & 0x80)
- {
- if (*(stream+1) & 0x40)
- {
- // byte0: 1aaaaaaa = NOTE
- bmf.streams[channel][pos].note = *stream & 0x7F;
- // byte1: 11bbbbbb = DELAY
- bmf.streams[channel][pos].delay = *(stream+1) & 0x3F;
- // byte2: cccccccc = COMMAND
-
- stream+=2;
-
- is_cmd = true;
- }
- else
- {
- // byte0: 1aaaaaaa = NOTE
- bmf.streams[channel][pos].note = *stream & 0x7F;
- // byte1: 11bbbbbb = DELAY
- bmf.streams[channel][pos].delay = *(stream+1) & 0x3F;
-
- stream+=2;
- } // if (*(stream+1) & 0x40)
- }
- else
- {
- // byte0: 1aaaaaaa = NOTE
- bmf.streams[channel][pos].note = *stream & 0x7F;
- // byte1: 0bbbbbbb = COMMAND
-
- stream++;
-
- is_cmd = true;
- } // if (*(stream+1) & 0x80)
- }
- else
- {
- // byte0: 0aaaaaaa = NOTE
- bmf.streams[channel][pos].note = *stream & 0x7F;
-
- stream++;
- } // if (*stream & 0x80)
- } // if (*stream == 0xFE)
-
- // is command ?
- if (is_cmd)
- {
-
- /* ALL */
-
- if ((0x20 <= *stream) && (*stream <= 0x3F))
- {
- // 0x20 or higher; 0x3F or lower: Set Instrument
- bmf.streams[channel][pos].instrument = *stream - 0x20 + 1;
-
- stream++;
- }
- else if (0x40 <= *stream)
- {
- // 0x40 or higher: Set Volume
- bmf.streams[channel][pos].volume = *stream - 0x40 + 1;
-
- stream++;
- }
- else
- {
-
- /* 0.9b */
-
- if (bmf.version == BMF0_9B)
- if (*stream < 0x20)
- {
- // 0x1F or lower: ?
- stream++;
- }
-
- /* 1.2 */
-
- if (bmf.version == BMF1_2)
- {
- if (*stream == 0x01)
- {
- // 0x01: Set Modulator Volume -> 0x01
- bmf.streams[channel][pos].cmd = 0x01;
- bmf.streams[channel][pos].cmd_data = *(stream+1);
-
- stream+=2;
- }
- else if (*stream == 0x02)
- {
- // 0x02: ?
- stream+=2;
- }
- else if (*stream == 0x03)
- {
- // 0x03: ?
- stream+=2;
- }
- else if (*stream == 0x04)
- {
- // 0x04: Set Speed -> 0x10
- bmf.streams[channel][pos].cmd = 0x10;
- bmf.streams[channel][pos].cmd_data = *(stream+1);
-
- stream+=2;
- }
- else if (*stream == 0x05)
- {
- // 0x05: Set Carrier Volume (port 380)
- bmf.streams[channel][pos].volume = *(stream+1) + 1;
-
- stream+=2;
- }
- else if (*stream == 0x06)
- {
- // 0x06: Set Carrier Volume (port 382)
- bmf.streams[channel][pos].volume = *(stream+1) + 1;
-
- stream+=2;
- }
- } // if (bmf.version == BMF1_2)
-
- } // if ((0x20 <= *stream) && (*stream <= 0x3F))
-
- } // if (is_cmd)
-
-#ifdef DEBUG
- AdPlug_LogWrite("%02X %02X %02X %02X %02X %02X <---- ",
- bmf.streams[channel][pos].note,
- bmf.streams[channel][pos].delay,
- bmf.streams[channel][pos].volume,
- bmf.streams[channel][pos].instrument,
- bmf.streams[channel][pos].cmd,
- bmf.streams[channel][pos].cmd_data
- );
- for(int zz=0;zz<(stream-last);zz++)
- AdPlug_LogWrite("%02X ",last[zz]);
- AdPlug_LogWrite("\n");
- last=stream;
-#endif
- pos++;
- } // while (true)
-
- return (stream - stream_start);
-}
diff --git a/src/adplug/core/bmf.h b/src/adplug/core/bmf.h
deleted file mode 100644
index aa76969..0000000
--- a/src/adplug/core/bmf.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] BMF player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadbmfPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadbmfPlayer(Copl *newopl): CxadPlayer(newopl)
- { };
- ~CxadbmfPlayer()
- { };
-
-protected:
- enum { BMF0_9B, BMF1_1, BMF1_2 };
- //
- struct bmf_event
- {
- unsigned char note;
- unsigned char delay;
- unsigned char volume;
- unsigned char instrument;
- unsigned char cmd;
- unsigned char cmd_data;
- };
-
- struct
- {
- unsigned char version;
- char title[36];
- char author[36];
- float timer;
- unsigned char speed;
-
- struct
- {
- char name[11];
- unsigned char data[13];
- } instruments[32];
-
- bmf_event streams[9][1024];
-
- int active_streams;
-
- struct
- {
- unsigned short stream_position;
- unsigned char delay;
- unsigned short loop_position;
- unsigned char loop_counter;
- } channel[9];
- } bmf;
- //
- bool xadplayer_load();
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
- std::string xadplayer_gettitle();
- std::string xadplayer_getauthor();
- std::string xadplayer_getinstrument(unsigned int i);
- unsigned int xadplayer_getinstruments();
- //
-private:
- static const unsigned char bmf_adlib_registers[117];
- static const unsigned short bmf_notes[12];
- static const unsigned short bmf_notes_2[12];
- static const unsigned char bmf_default_instrument[13];
-
- int __bmf_convert_stream(unsigned char *stream, int channel);
-};
diff --git a/src/adplug/core/cff.cc b/src/adplug/core/cff.cc
deleted file mode 100644
index 7fd45d6..0000000
--- a/src/adplug/core/cff.cc
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2008 Simon Peter <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- cff.cpp - BoomTracker loader by Riven the Mage <riven@ok.ru>
-*/
-/*
- NOTE: Conversion of slides is not 100% accurate. Original volume slides
- have effect on carrier volume only. Also, original arpeggio, frequency & volume
- slides use previous effect data instead of current.
-*/
-
-#include <cstring>
-#include <stdlib.h>
-#include <string.h>
-
-#include "cff.h"
-
-/* -------- Public Methods -------------------------------- */
-
-CPlayer *CcffLoader::factory(Copl *newopl)
-{
- return new CcffLoader(newopl);
-}
-
-bool CcffLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- const unsigned char conv_inst[11] = { 2,1,10,9,4,3,6,5,0,8,7 };
- const unsigned short conv_note[12] = { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287, 0x2AE };
-
- int i,j,k,t=0;
-
- // '<CUD-FM-File>' - signed ?
- f->readString(header.id, 16);
- header.version = f->readInt(1); header.size = f->readInt(2);
- header.packed = f->readInt(1); f->readString((char *)header.reserved, 12);
- if (memcmp(header.id,"<CUD-FM-File>""\x1A\xDE\xE0",16))
- { fp.close(f); return false; }
-
- unsigned char *module = new unsigned char [0x10000];
-
- // packed ?
- if (header.packed)
- {
- cff_unpacker *unpacker = new cff_unpacker;
-
- unsigned char *packed_module = new unsigned char [header.size + 4];
-
- memset(packed_module,0,header.size + 4);
-
- f->readString((char *)packed_module, header.size);
- fp.close(f);
-
- if (!unpacker->unpack(packed_module,module))
- {
- delete unpacker;
- delete [] packed_module;
- delete [] module;
- return false;
- }
-
- delete unpacker;
- delete [] packed_module;
-
- if (memcmp(&module[0x5E1],"CUD-FM-File - SEND A POSTCARD -",31))
- {
- delete [] module;
- return false;
- }
- }
- else
- {
- f->readString((char *)module, header.size);
- fp.close(f);
- }
-
- // init CmodPlayer
- realloc_instruments(47);
- realloc_order(64);
- realloc_patterns(36,64,9);
- init_notetable(conv_note);
- init_trackord();
-
- // load instruments
- for (i=0;i<47;i++)
- {
- memcpy(&instruments[i],&module[i*32],sizeof(cff_instrument));
-
- for (j=0;j<11;j++)
- inst[i].data[conv_inst[j]] = instruments[i].data[j];
-
- instruments[i].name[20] = 0;
- }
-
- // number of patterns
- nop = module[0x5E0];
-
- // load title & author
- memcpy(song_title,&module[0x614],20);
- memcpy(song_author,&module[0x600],20);
-
- // load order
- memcpy(order,&module[0x628],64);
-
- // load tracks
- for (i=0;i<nop;i++)
- {
- unsigned char old_event_byte2[9];
-
- memset(old_event_byte2,0,9);
-
- for (j=0;j<9;j++)
- {
- for (k=0;k<64;k++)
- {
- cff_event *event = (cff_event *)&module[0x669 + ((i*64+k)*9+j)*3];
-
- // convert note
- if (event->byte0 == 0x6D)
- tracks[t][k].note = 127;
- else
- if (event->byte0)
- tracks[t][k].note = event->byte0;
-
- if (event->byte2)
- old_event_byte2[j] = event->byte2;
-
- // convert effect
- switch (event->byte1)
- {
- case 'I': // set instrument
- tracks[t][k].inst = event->byte2 + 1;
- tracks[t][k].param1 = tracks[t][k].param2 = 0;
- break;
-
- case 'H': // set tempo
- tracks[t][k].command = 7;
- if (event->byte2 < 16)
- {
- tracks[t][k].param1 = 0x07;
- tracks[t][k].param2 = 0x0D;
- }
- break;
-
- case 'A': // set speed
- tracks[t][k].command = 19;
- tracks[t][k].param1 = event->byte2 >> 4;
- tracks[t][k].param2 = event->byte2 & 15;
- break;
-
- case 'L': // pattern break
- tracks[t][k].command = 13;
- tracks[t][k].param1 = event->byte2 >> 4;
- tracks[t][k].param2 = event->byte2 & 15;
- break;
-
- case 'K': // order jump
- tracks[t][k].command = 11;
- tracks[t][k].param1 = event->byte2 >> 4;
- tracks[t][k].param2 = event->byte2 & 15;
- break;
-
- case 'M': // set vibrato/tremolo
- tracks[t][k].command = 27;
- tracks[t][k].param1 = event->byte2 >> 4;
- tracks[t][k].param2 = event->byte2 & 15;
- break;
-
- case 'C': // set modulator volume
- tracks[t][k].command = 21;
- tracks[t][k].param1 = (0x3F - event->byte2) >> 4;
- tracks[t][k].param2 = (0x3F - event->byte2) & 15;
- break;
-
- case 'G': // set carrier volume
- tracks[t][k].command = 22;
- tracks[t][k].param1 = (0x3F - event->byte2) >> 4;
- tracks[t][k].param2 = (0x3F - event->byte2) & 15;
- break;
-
- case 'B': // set carrier waveform
- tracks[t][k].command = 25;
- tracks[t][k].param1 = event->byte2;
- tracks[t][k].param2 = 0x0F;
- break;
-
- case 'E': // fine frequency slide down
- tracks[t][k].command = 24;
- tracks[t][k].param1 = old_event_byte2[j] >> 4;
- tracks[t][k].param2 = old_event_byte2[j] & 15;
- break;
-
- case 'F': // fine frequency slide up
- tracks[t][k].command = 23;
- tracks[t][k].param1 = old_event_byte2[j] >> 4;
- tracks[t][k].param2 = old_event_byte2[j] & 15;
- break;
-
- case 'D': // fine volume slide
- tracks[t][k].command = 14;
- if (old_event_byte2[j] & 15)
- {
- // slide down
- tracks[t][k].param1 = 5;
- tracks[t][k].param2 = old_event_byte2[j] & 15;
- }
- else
- {
- // slide up
- tracks[t][k].param1 = 4;
- tracks[t][k].param2 = old_event_byte2[j] >> 4;
- }
- break;
-
- case 'J': // arpeggio
- tracks[t][k].param1 = old_event_byte2[j] >> 4;
- tracks[t][k].param2 = old_event_byte2[j] & 15;
- break;
- }
- }
-
- t++;
- }
- }
-
- delete [] module;
-
- // order loop
- restartpos = 0;
-
- // order length
- for (i=0;i<64;i++)
- {
- if (order[i] >= 0x80)
- {
- length = i;
- break;
- }
- }
-
- // default tempo
- bpm = 0x7D;
-
- rewind(0);
-
- return true;
-}
-
-void CcffLoader::rewind(int subsong)
-{
- CmodPlayer::rewind(subsong);
-
- // default instruments
- for (int i=0;i<9;i++)
- {
- channel[i].inst = i;
-
- channel[i].vol1 = 63 - (inst[i].data[10] & 63);
- channel[i].vol2 = 63 - (inst[i].data[9] & 63);
- }
-}
-
-std::string CcffLoader::gettype()
-{
- if (header.packed)
- return std::string("BoomTracker 4, packed");
- else
- return std::string("BoomTracker 4");
-}
-
-std::string CcffLoader::gettitle()
-{
- return std::string(song_title,20);
-}
-
-std::string CcffLoader::getauthor()
-{
- return std::string(song_author,20);
-}
-
-std::string CcffLoader::getinstrument(unsigned int n)
-{
- return std::string(instruments[n].name);
-}
-
-unsigned int CcffLoader::getinstruments()
-{
- return 47;
-}
-
-/* -------- Private Methods ------------------------------- */
-
-/*
- Lempel-Ziv-Tyr ;-)
-*/
-long CcffLoader::cff_unpacker::unpack(unsigned char *ibuf, unsigned char *obuf)
-{
- if (memcmp(ibuf,"YsComp""\x07""CUD1997""\x1A\x04",16))
- return 0;
-
- input = ibuf + 16;
- output = obuf;
-
- output_length = 0;
-
- heap = (unsigned char *)malloc(0x10000);
- dictionary = (unsigned char **)malloc(sizeof(unsigned char *)*0x8000);
-
- memset(heap,0,0x10000);
- memset(dictionary,0,0x8000);
-
- cleanup();
- if(!startup())
- goto out;
-
- // LZW
- while (1)
- {
- new_code = get_code();
-
- // 0x00: end of data
- if (new_code == 0)
- break;
-
- // 0x01: end of block
- if (new_code == 1)
- {
- cleanup();
- if(!startup())
- goto out;
-
- continue;
- }
-
- // 0x02: expand code length
- if (new_code == 2)
- {
- code_length++;
-
- continue;
- }
-
- // 0x03: RLE
- if (new_code == 3)
- {
- unsigned char old_code_length = code_length;
-
- code_length = 2;
-
- unsigned char repeat_length = get_code() + 1;
-
- code_length = 4 << get_code();
-
- unsigned long repeat_counter = get_code();
-
- if(output_length + repeat_counter * repeat_length > 0x10000) {
- output_length = 0;
- goto out;
- }
-
- for (unsigned int i=0;i<repeat_counter*repeat_length;i++) {
- output[output_length] = output[output_length - repeat_length];
- output_length++;
- }
-
- code_length = old_code_length;
-
- if(!startup())
- goto out;
-
- continue;
- }
-
- if (new_code >= (0x104 + dictionary_length))
- {
- // dictionary <- old.code.string + old.code.char
- the_string[++the_string[0]] = the_string[1];
- }
- else
- {
- // dictionary <- old.code.string + new.code.char
- unsigned char temp_string[256];
-
- translate_code(new_code,temp_string);
-
- the_string[++the_string[0]] = temp_string[1];
- }
-
- expand_dictionary(the_string);
-
- // output <- new.code.string
- translate_code(new_code,the_string);
-
- if(output_length + the_string[0] > 0x10000) {
- output_length = 0;
- goto out;
- }
-
- for (int i=0;i<the_string[0];i++)
- output[output_length++] = the_string[i+1];
-
- old_code = new_code;
- }
-
- out:
- free(heap);
- free(dictionary);
- return output_length;
-}
-
-unsigned long CcffLoader::cff_unpacker::get_code()
-{
- unsigned long code;
-
- while (bits_left < code_length)
- {
- bits_buffer |= ((*input++) << bits_left);
- bits_left += 8;
- }
-
- code = bits_buffer & ((1 << code_length) - 1);
-
- bits_buffer >>= code_length;
- bits_left -= code_length;
-
- return code;
-}
-
-void CcffLoader::cff_unpacker::translate_code(unsigned long code, unsigned char *string)
-{
- unsigned char translated_string[256];
-
- if (code >= 0x104)
- {
- memcpy(translated_string,dictionary[code - 0x104],(*(dictionary[code - 0x104])) + 1);
- }
- else
- {
- translated_string[0] = 1;
- translated_string[1] = (code - 4) & 0xFF;
- }
-
- memcpy(string,translated_string,256);
-}
-
-void CcffLoader::cff_unpacker::cleanup()
-{
- code_length = 9;
-
- bits_buffer = 0;
- bits_left = 0;
-
- heap_length = 0;
- dictionary_length = 0;
-}
-
-int CcffLoader::cff_unpacker::startup()
-{
- old_code = get_code();
-
- translate_code(old_code,the_string);
-
- if(output_length + the_string[0] > 0x10000) {
- output_length = 0;
- return 0;
- }
-
- for (int i=0;i<the_string[0];i++)
- output[output_length++] = the_string[i+1];
-
- return 1;
-}
-
-void CcffLoader::cff_unpacker::expand_dictionary(unsigned char *string)
-{
- if (string[0] >= 0xF0)
- return;
-
- memcpy(&heap[heap_length],string,string[0] + 1);
-
- dictionary[dictionary_length] = &heap[heap_length];
-
- dictionary_length++;
-
- heap_length += (string[0] + 1);
-}
diff --git a/src/adplug/core/cff.h b/src/adplug/core/cff.h
deleted file mode 100644
index ed593b9..0000000
--- a/src/adplug/core/cff.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2006 Simon Peter <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- cff.h - BoomTracker loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include "protrack.h"
-
-class CcffLoader: public CmodPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CcffLoader(Copl *newopl) : CmodPlayer(newopl) { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- void rewind(int subsong);
-
- std::string gettype();
- std::string gettitle();
- std::string getauthor();
- std::string getinstrument(unsigned int n);
- unsigned int getinstruments();
-
- private:
-
- class cff_unpacker
- {
- public:
-
- long unpack(unsigned char *ibuf, unsigned char *obuf);
-
- private:
-
- unsigned long get_code();
- void translate_code(unsigned long code, unsigned char *string);
-
- void cleanup();
- int startup();
-
- void expand_dictionary(unsigned char *string);
-
- unsigned char *input;
- unsigned char *output;
-
- long output_length;
-
- unsigned char code_length;
-
- unsigned long bits_buffer;
- unsigned int bits_left;
-
- unsigned char *heap;
- unsigned char **dictionary;
-
- unsigned int heap_length;
- unsigned int dictionary_length;
-
- unsigned long old_code,new_code;
-
- unsigned char the_string[256];
- };
-
- struct cff_header
- {
- char id[16];
- unsigned char version;
- unsigned short size;
- unsigned char packed;
- unsigned char reserved[12];
- } header;
-
- struct cff_instrument
- {
- unsigned char data[12];
- char name[21];
- } instruments[47];
-
- char song_title[20];
- char song_author[20];
-
- struct cff_event
- {
- unsigned char byte0;
- unsigned char byte1;
- unsigned char byte2;
- };
-};
diff --git a/src/adplug/core/cmf.cc b/src/adplug/core/cmf.cc
deleted file mode 100644
index c9a0fd4..0000000
--- a/src/adplug/core/cmf.cc
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2009 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * cmf.cpp - CMF player by Adam Nielsen <malvineous@shikadi.net>
- * Subset of CMF reader in MOPL code (Malvineous' OPL player), no seeking etc.
- */
-
-#include <stdint.h> // for uintxx_t
-#include <cassert>
-#include <math.h> // for pow() etc.
-#include <string.h> // for memset
-#include "debug.h"
-#include "cmf.h"
-
-// ------------------------------
-// OPTIONS
-// ------------------------------
-
-// The official Creative Labs CMF player seems to ignore the note velocity
-// (playing every note at the same volume), but you can uncomment this to
-// allow the note velocity to affect the volume (as presumably the composer
-// originally intended.)
-//
-//#define USE_VELOCITY
-//
-// The Xargon demo song is a good example of a song that uses note velocity.
-
-// OPL register offsets
-#define BASE_CHAR_MULT 0x20
-#define BASE_SCAL_LEVL 0x40
-#define BASE_ATCK_DCAY 0x60
-#define BASE_SUST_RLSE 0x80
-#define BASE_FNUM_L 0xA0
-#define BASE_KEYON_FREQ 0xB0
-#define BASE_RHYTHM 0xBD
-#define BASE_WAVE 0xE0
-#define BASE_FEED_CONN 0xC0
-
-#define OPLBIT_KEYON 0x20 // Bit in BASE_KEYON_FREQ register for turning a note on
-
-// Supplied with a channel, return the offset from a base OPL register for the
-// Modulator cell (e.g. channel 4's modulator is at offset 0x09. Since 0x60 is
-// the attack/decay function, register 0x69 will thus set the attack/decay for
-// channel 4's modulator.) (channels go from 0 to 8 inclusive)
-#define OPLOFFSET(channel) (((channel) / 3) * 8 + ((channel) % 3))
-
-// These 16 instruments are repeated to fill up the 128 available slots. A CMF
-// file can override none/some/all of the 128 slots with custom instruments,
-// so any that aren't overridden are still available for use with these default
-// patches. The Word Rescue CMFs are good examples of songs that rely on these
-// default patches.
-uint8_t cDefaultPatches[] =
-"\x01\x11\x4F\x00\xF1\xD2\x53\x74\x00\x00\x06"
-"\x07\x12\x4F\x00\xF2\xF2\x60\x72\x00\x00\x08"
-"\x31\xA1\x1C\x80\x51\x54\x03\x67\x00\x00\x0E"
-"\x31\xA1\x1C\x80\x41\x92\x0B\x3B\x00\x00\x0E"
-"\x31\x16\x87\x80\xA1\x7D\x11\x43\x00\x00\x08"
-"\x30\xB1\xC8\x80\xD5\x61\x19\x1B\x00\x00\x0C"
-"\xF1\x21\x01\x00\x97\xF1\x17\x18\x00\x00\x08"
-"\x32\x16\x87\x80\xA1\x7D\x10\x33\x00\x00\x08"
-"\x01\x12\x4F\x00\x71\x52\x53\x7C\x00\x00\x0A"
-"\x02\x03\x8D\x00\xD7\xF5\x37\x18\x00\x00\x04"
-"\x21\x21\xD1\x00\xA3\xA4\x46\x25\x00\x00\x0A"
-"\x22\x22\x0F\x00\xF6\xF6\x95\x36\x00\x00\x0A"
-"\xE1\xE1\x00\x00\x44\x54\x24\x34\x02\x02\x07"
-"\xA5\xB1\xD2\x80\x81\xF1\x03\x05\x00\x00\x02"
-"\x71\x22\xC5\x00\x6E\x8B\x17\x0E\x00\x00\x02"
-"\x32\x21\x16\x80\x73\x75\x24\x57\x00\x00\x0E";
-
-
-CPlayer *CcmfPlayer::factory(Copl *newopl)
-{
- return new CcmfPlayer(newopl);
-}
-
-CcmfPlayer::CcmfPlayer(Copl *newopl) :
- CPlayer(newopl),
- data(NULL),
- pInstruments(NULL),
- bPercussive(false),
- iTranspose(0),
- iPrevCommand(0)
-{
- assert(OPLOFFSET(1-1) == 0x00);
- assert(OPLOFFSET(5-1) == 0x09);
- assert(OPLOFFSET(9-1) == 0x12);
-}
-
-CcmfPlayer::~CcmfPlayer()
-{
- if (this->data) delete[] data;
- if (this->pInstruments) delete[] pInstruments;
-}
-
-bool CcmfPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
-
- char cSig[4];
- f->readString(cSig, 4);
- if (
- (cSig[0] != 'C') ||
- (cSig[1] != 'T') ||
- (cSig[2] != 'M') ||
- (cSig[3] != 'F')
- ) {
- // Not a CMF file
- fp.close(f);
- return false;
- }
- uint16_t iVer = f->readInt(2);
- if ((iVer != 0x0101) && (iVer != 0x0100)) {
- AdPlug_LogWrite("CMF file is not v1.0 or v1.1 (reports %d.%d)\n", iVer >> 8 , iVer & 0xFF);
- fp.close(f);
- return false;
- }
-
- this->cmfHeader.iInstrumentBlockOffset = f->readInt(2);
- this->cmfHeader.iMusicOffset = f->readInt(2);
- this->cmfHeader.iTicksPerQuarterNote = f->readInt(2);
- this->cmfHeader.iTicksPerSecond = f->readInt(2);
- this->cmfHeader.iTagOffsetTitle = f->readInt(2);
- this->cmfHeader.iTagOffsetComposer = f->readInt(2);
- this->cmfHeader.iTagOffsetRemarks = f->readInt(2);
- f->readString((char *)this->cmfHeader.iChannelsInUse, 16);
- if (iVer == 0x0100) {
- this->cmfHeader.iNumInstruments = f->readInt(1);
- this->cmfHeader.iTempo = 0;
- } else { // 0x0101
- this->cmfHeader.iNumInstruments = f->readInt(2);
- this->cmfHeader.iTempo = f->readInt(2);
- }
-
- // Load the instruments
-
- f->seek(this->cmfHeader.iInstrumentBlockOffset);
- this->pInstruments = new SBI[
- (this->cmfHeader.iNumInstruments < 128) ? 128 : this->cmfHeader.iNumInstruments
- ]; // Always at least 128 available for use
-
- for (int i = 0; i < this->cmfHeader.iNumInstruments; i++) {
- this->pInstruments[i].op[0].iCharMult = f->readInt(1);
- this->pInstruments[i].op[1].iCharMult = f->readInt(1);
- this->pInstruments[i].op[0].iScalingOutput = f->readInt(1);
- this->pInstruments[i].op[1].iScalingOutput = f->readInt(1);
- this->pInstruments[i].op[0].iAttackDecay = f->readInt(1);
- this->pInstruments[i].op[1].iAttackDecay = f->readInt(1);
- this->pInstruments[i].op[0].iSustainRelease = f->readInt(1);
- this->pInstruments[i].op[1].iSustainRelease = f->readInt(1);
- this->pInstruments[i].op[0].iWaveSel = f->readInt(1);
- this->pInstruments[i].op[1].iWaveSel = f->readInt(1);
- this->pInstruments[i].iConnection = f->readInt(1);
- f->seek(5, binio::Add); // skip over the padding bytes
- }
-
- // Set the rest of the instruments to the CMF defaults
- for (int i = this->cmfHeader.iNumInstruments; i < 128; i++) {
- this->pInstruments[i].op[0].iCharMult = cDefaultPatches[(i % 16) * 11 + 0];
- this->pInstruments[i].op[1].iCharMult = cDefaultPatches[(i % 16) * 11 + 1];
- this->pInstruments[i].op[0].iScalingOutput = cDefaultPatches[(i % 16) * 11 + 2];
- this->pInstruments[i].op[1].iScalingOutput = cDefaultPatches[(i % 16) * 11 + 3];
- this->pInstruments[i].op[0].iAttackDecay = cDefaultPatches[(i % 16) * 11 + 4];
- this->pInstruments[i].op[1].iAttackDecay = cDefaultPatches[(i % 16) * 11 + 5];
- this->pInstruments[i].op[0].iSustainRelease = cDefaultPatches[(i % 16) * 11 + 6];
- this->pInstruments[i].op[1].iSustainRelease = cDefaultPatches[(i % 16) * 11 + 7];
- this->pInstruments[i].op[0].iWaveSel = cDefaultPatches[(i % 16) * 11 + 8];
- this->pInstruments[i].op[1].iWaveSel = cDefaultPatches[(i % 16) * 11 + 9];
- this->pInstruments[i].iConnection = cDefaultPatches[(i % 16) * 11 + 10];
- }
-
- if (this->cmfHeader.iTagOffsetTitle) {
- f->seek(this->cmfHeader.iTagOffsetTitle);
- this->strTitle = f->readString('\0');
- }
- if (this->cmfHeader.iTagOffsetComposer) {
- f->seek(this->cmfHeader.iTagOffsetComposer);
- this->strComposer = f->readString('\0');
- }
- if (this->cmfHeader.iTagOffsetRemarks) {
- f->seek(this->cmfHeader.iTagOffsetRemarks);
- this->strRemarks = f->readString('\0');
- }
-
- // Load the MIDI data into memory
- f->seek(this->cmfHeader.iMusicOffset);
- this->iSongLen = fp.filesize(f) - this->cmfHeader.iMusicOffset;
- this->data = new unsigned char[this->iSongLen];
- f->readString((char *)data, this->iSongLen);
-
- fp.close(f);
- rewind(0);
-
- return true;
-}
-
-bool CcmfPlayer::update()
-{
- // This has to be here and not in getrefresh() for some reason.
- this->iDelayRemaining = 0;
-
- // Read in the next event
- while (!this->iDelayRemaining) {
- uint8_t iCommand = this->data[this->iPlayPointer++];
- if ((iCommand & 0x80) == 0) {
- // Running status, use previous command
- this->iPlayPointer--;
- iCommand = this->iPrevCommand;
- } else {
- this->iPrevCommand = iCommand;
- }
- uint8_t iChannel = iCommand & 0x0F;
- switch (iCommand & 0xF0) {
- case 0x80: { // Note off (two data bytes)
- uint8_t iNote = this->data[this->iPlayPointer++];
- uint8_t iVelocity = this->data[this->iPlayPointer++]; // release velocity
- this->cmfNoteOff(iChannel, iNote, iVelocity);
- break;
- }
- case 0x90: { // Note on (two data bytes)
- uint8_t iNote = this->data[this->iPlayPointer++];
- uint8_t iVelocity = this->data[this->iPlayPointer++]; // attack velocity
- if (iVelocity) {
- this->cmfNoteOn(iChannel, iNote, iVelocity);
- } else {
- // This is a note-off instead (velocity == 0)
- this->cmfNoteOff(iChannel, iNote, iVelocity); // 64 is the MIDI default note-off velocity
- break;
- }
- break;
- }
- case 0xA0: { // Polyphonic key pressure (two data bytes)
- uint8_t iNote = this->data[this->iPlayPointer++];
- uint8_t iPressure = this->data[this->iPlayPointer++];
- AdPlug_LogWrite("CMF: Key pressure not yet implemented! (wanted ch%d/note %d set to %d)\n", iChannel, iNote, iPressure);
- break;
- }
- case 0xB0: { // Controller (two data bytes)
- uint8_t iController = this->data[this->iPlayPointer++];
- uint8_t iValue = this->data[this->iPlayPointer++];
- this->MIDIcontroller(iChannel, iController, iValue);
- break;
- }
- case 0xC0: { // Instrument change (one data byte)
- uint8_t iNewInstrument = this->data[this->iPlayPointer++];
- this->chMIDI[iChannel].iPatch = iNewInstrument;
- AdPlug_LogWrite("CMF: Remembering MIDI channel %d now uses patch %d\n", iChannel, iNewInstrument);
- break;
- }
- case 0xD0: { // Channel pressure (one data byte)
- uint8_t iPressure = this->data[this->iPlayPointer++];
- AdPlug_LogWrite("CMF: Channel pressure not yet implemented! (wanted ch%d set to %d)\n", iChannel, iPressure);
- break;
- }
- case 0xE0: { // Pitch bend (two data bytes)
- uint8_t iLSB = this->data[this->iPlayPointer++];
- uint8_t iMSB = this->data[this->iPlayPointer++];
- uint16_t iValue = (iMSB << 7) | iLSB;
- // 8192 is middle/off, 0 is -2 semitones, 16384 is +2 semitones
- this->chMIDI[iChannel].iPitchbend = iValue;
- AdPlug_LogWrite("CMF: Channel %d pitchbent to %d (%+.2f)\n", iChannel + 1, iValue, (float)(iValue - 8192) / 8192);
- break;
- }
- case 0xF0: // System message (arbitrary data bytes)
- switch (iCommand) {
- case 0xF0: { // Sysex
- uint8_t iNextByte;
- AdPlug_LogWrite("Sysex message: ");
- do {
- iNextByte = this->data[this->iPlayPointer++];
- AdPlug_LogWrite("%02X", iNextByte);
- } while ((iNextByte & 0x80) == 0);
- AdPlug_LogWrite("\n");
- // This will have read in the terminating EOX (0xF7) message too
- break;
- }
- case 0xF1: // MIDI Time Code Quarter Frame
- this->iPlayPointer++; // message data (ignored)
- break;
- case 0xF2: // Song position pointer
- this->iPlayPointer++; // message data (ignored)
- this->iPlayPointer++;
- break;
- case 0xF3: // Song select
- this->iPlayPointer++; // message data (ignored)
- AdPlug_LogWrite("CMF: MIDI Song Select is not implemented.\n");
- break;
- case 0xF6: // Tune request
- break;
- case 0xF7: // End of System Exclusive (EOX) - should never be read, should be absorbed by Sysex handling code
- break;
-
- // These messages are "real time", meaning they can be sent between
- // the bytes of other messages - but we're lazy and don't handle these
- // here (hopefully they're not necessary in a MIDI file, and even less
- // likely to occur in a CMF.)
- case 0xF8: // Timing clock (sent 24 times per quarter note, only when playing)
- case 0xFA: // Start
- case 0xFB: // Continue
- case 0xFE: // Active sensing (sent every 300ms or MIDI connection assumed lost)
- break;
- case 0xFC: // Stop
- AdPlug_LogWrite("CMF: Received Real Time Stop message (0xFC)\n");
- this->bSongEnd = true;
- this->iPlayPointer = 0; // for repeat in endless-play mode
- break;
- case 0xFF: { // System reset, used as meta-events in a MIDI file
- uint8_t iEvent = this->data[this->iPlayPointer++];
- switch (iEvent) {
- case 0x2F: // end of track
- AdPlug_LogWrite("CMF: End-of-track, stopping playback\n");
- this->bSongEnd = true;
- this->iPlayPointer = 0; // for repeat in endless-play mode
- break;
- default:
- AdPlug_LogWrite("CMF: Unknown MIDI meta-event 0xFF 0x%02X\n", iEvent);
- break;
- }
- break;
- }
- default:
- AdPlug_LogWrite("CMF: Unknown MIDI system command 0x%02X\n", iCommand);
- break;
- }
- break;
- default:
- AdPlug_LogWrite("CMF: Unknown MIDI command 0x%02X\n", iCommand);
- break;
- }
-
- if (this->iPlayPointer >= this->iSongLen) {
- this->bSongEnd = true;
- this->iPlayPointer = 0; // for repeat in endless-play mode
- }
-
- // Read in the number of ticks until the next event
- this->iDelayRemaining = this->readMIDINumber();
- }
-
- return !this->bSongEnd;
-}
-
-void CcmfPlayer::rewind(int subsong)
-{
- this->opl->init();
-
- // Initialise
-
- // Enable use of WaveSel register on OPL3 (even though we're only an OPL2!)
- // Apparently this enables nine-channel mode?
- this->writeOPL(0x01, 0x20);
-
- // Disable OPL3 mode (can be left enabled by a previous non-CMF song)
- this->writeOPL(0x05, 0x00);
-
- // Really make sure CSM+SEL are off (again, Creative's player...)
- this->writeOPL(0x08, 0x00);
-
- // This freq setting is required for the hihat to sound correct at the start
- // of funky.cmf, even though it's for an unrelated channel.
- // If it's here however, it makes the hihat in Word Rescue's theme.cmf
- // sound really bad.
- // TODO: How do we figure out whether we need it or not???
- this->writeOPL(BASE_FNUM_L + 8, 514 & 0xFF);
- this->writeOPL(BASE_KEYON_FREQ + 8, (1 << 2) | (514 >> 8));
-
- // default freqs?
- this->writeOPL(BASE_FNUM_L + 7, 509 & 0xFF);
- this->writeOPL(BASE_KEYON_FREQ + 7, (2 << 2) | (509 >> 8));
- this->writeOPL(BASE_FNUM_L + 6, 432 & 0xFF);
- this->writeOPL(BASE_KEYON_FREQ + 6, (2 << 2) | (432 >> 8));
-
- // Amplify AM + VIB depth. Creative's CMF player does this, and there
- // doesn't seem to be any way to stop it from doing so - except for the
- // non-standard controller 0x63 I added :-)
- this->writeOPL(0xBD, 0xC0);
-
- this->bSongEnd = false;
- this->iPlayPointer = 0;
- this->iPrevCommand = 0; // just in case
-
- // Read in the number of ticks until the first event
- this->iDelayRemaining = this->readMIDINumber();
-
- // Reset song state. This used to be in the constructor, but the XMMS2
- // plugin sets the song length before starting playback. AdPlug plays the
- // song in its entirety (with no synth) to determine the song length, which
- // results in the state variables below matching the end of the song. When
- // the real OPL synth is activated for playback, it no longer matches the
- // state variables and the instruments are not set correctly!
- for (int i = 0; i < 9; i++) {
- this->chOPL[i].iNoteStart = 0; // no note playing atm
- this->chOPL[i].iMIDINote = -1;
- this->chOPL[i].iMIDIChannel = -1;
- this->chOPL[i].iMIDIPatch = -1;
-
- this->chMIDI[i].iPatch = -2;
- this->chMIDI[i].iPitchbend = 8192;
- }
- for (int i = 9; i < 16; i++) {
- this->chMIDI[i].iPatch = -2;
- this->chMIDI[i].iPitchbend = 8192;
- }
-
- memset(this->iCurrentRegs, 0, 256);
-
- return;
-}
-
-// Return value: 1 == 1 second, 2 == 0.5 seconds
-float CcmfPlayer::getrefresh()
-{
- if (this->iDelayRemaining) {
- return (float)this->cmfHeader.iTicksPerSecond / (float)this->iDelayRemaining;
- } else {
- // Delay-remaining is zero (e.g. start of song) so use a tiny delay
- return this->cmfHeader.iTicksPerSecond; // wait for one tick
- }
-}
-
-std::string CcmfPlayer::gettitle()
-{
- return this->strTitle;
-}
-std::string CcmfPlayer::getauthor()
-{
- return this->strComposer;
-}
-std::string CcmfPlayer::getdesc()
-{
- return this->strRemarks;
-}
-
-
-//
-// PROTECTED
-//
-
-// Read a variable-length integer from MIDI data
-uint32_t CcmfPlayer::readMIDINumber()
-{
- uint32_t iValue = 0;
- for (int i = 0; i < 4; i++) {
- uint8_t iNext = this->data[this->iPlayPointer++];
- iValue <<= 7;
- iValue |= (iNext & 0x7F); // ignore the MSB
- if ((iNext & 0x80) == 0) break; // last byte has the MSB unset
- }
- return iValue;
-}
-
-// iChannel: OPL channel (0-8)
-// iOperator: 0 == Modulator, 1 == Carrier
-// Source - source operator to read from instrument definition
-// Dest - destination operator on OPL chip
-// iInstrument: Index into this->pInstruments array of CMF instruments
-void CcmfPlayer::writeInstrumentSettings(uint8_t iChannel, uint8_t iOperatorSource, uint8_t iOperatorDest, uint8_t iInstrument)
-{
- assert(iChannel <= 8);
-
- uint8_t iOPLOffset = OPLOFFSET(iChannel);
- if (iOperatorDest) iOPLOffset += 3; // Carrier if iOperator == 1 (else Modulator)
-
- this->writeOPL(BASE_CHAR_MULT + iOPLOffset, this->pInstruments[iInstrument].op[iOperatorSource].iCharMult);
- this->writeOPL(BASE_SCAL_LEVL + iOPLOffset, this->pInstruments[iInstrument].op[iOperatorSource].iScalingOutput);
- this->writeOPL(BASE_ATCK_DCAY + iOPLOffset, this->pInstruments[iInstrument].op[iOperatorSource].iAttackDecay);
- this->writeOPL(BASE_SUST_RLSE + iOPLOffset, this->pInstruments[iInstrument].op[iOperatorSource].iSustainRelease);
- this->writeOPL(BASE_WAVE + iOPLOffset, this->pInstruments[iInstrument].op[iOperatorSource].iWaveSel);
-
- // TODO: Check to see whether we should only be loading this for one or both operators
- this->writeOPL(BASE_FEED_CONN + iChannel, this->pInstruments[iInstrument].iConnection);
- return;
-}
-
-// Write a byte to the OPL "chip" and update the current record of register states
-void CcmfPlayer::writeOPL(uint8_t iRegister, uint8_t iValue)
-{
- this->opl->write(iRegister, iValue);
- this->iCurrentRegs[iRegister] = iValue;
- return;
-}
-
-void CcmfPlayer::cmfNoteOn(uint8_t iChannel, uint8_t iNote, uint8_t iVelocity)
-{
- uint8_t iBlock = iNote / 12;
- if (iBlock > 1) iBlock--; // keep in the same range as the Creative player
- //if (iBlock > 7) iBlock = 7; // don't want to go out of range
-
- double d = pow(2, (
- (double)iNote + (
- (this->chMIDI[iChannel].iPitchbend - 8192) / 8192.0
- ) + (
- this->iTranspose / 128
- ) - 9) / 12.0 - (iBlock - 20))
- * 440.0 / 32.0 / 50000.0;
- uint16_t iOPLFNum = (uint16_t)(d+0.5);
- if (iOPLFNum > 1023) AdPlug_LogWrite("CMF: This note is out of range! (send this song to malvineous@shikadi.net!)\n");
-
- // See if we're playing a rhythm mode percussive instrument
- if ((iChannel > 10) && (this->bPercussive)) {
- uint8_t iPercChannel = this->getPercChannel(iChannel);
-
- // Will have to set every time (easier) than figuring out whether the mod
- // or car needs to be changed.
- //if (this->chOPL[iPercChannel].iMIDIPatch != this->chMIDI[iChannel].iPatch) {
- this->MIDIchangeInstrument(iPercChannel, iChannel, this->chMIDI[iChannel].iPatch);
- //}
-
- /* Velocity calculations - TODO: Work out the proper formula
-
- iVelocity -> iLevel (values generated by Creative's player)
- 7f -> 00
- 7c -> 00
-
- 7b -> 09
- 73 -> 0a
- 6b -> 0b
- 63 -> 0c
- 5b -> 0d
- 53 -> 0e
- 4b -> 0f
- 43 -> 10
- 3b -> 11
- 33 -> 13
- 2b -> 15
- 23 -> 19
- 1b -> 1b
- 13 -> 1d
- 0b -> 1f
- 03 -> 21
-
- 02 -> 21
- 00 -> N/A (note off)
- */
- // Approximate formula, need to figure out more accurate one (my maths isn't so good...)
- int iLevel = 0x25 - sqrt(iVelocity * 16/*6*/);//(127 - iVelocity) * 0x20 / 127;
- if (iVelocity > 0x7b) iLevel = 0; // full volume
- if (iLevel < 0) iLevel = 0;
- if (iLevel > 0x3F) iLevel = 0x3F;
- //if (iVelocity < 0x40) iLevel = 0x10;
-
- int iOPLOffset = BASE_SCAL_LEVL + OPLOFFSET(iPercChannel);
- //if ((iChannel == 11) || (iChannel == 12) || (iChannel == 14)) {
- if (iChannel == 11) iOPLOffset += 3; // only do bassdrum carrier for volume control
- //iOPLOffset += 3; // carrier
- this->writeOPL(iOPLOffset, (this->iCurrentRegs[iOPLOffset] & ~0x3F) | iLevel);//(iVelocity * 0x3F / 127));
- //}
- // Bass drum (ch11) uses both operators
- //if (iChannel == 11) this->writeOPL(iOPLOffset + 3, (this->iCurrentRegs[iOPLOffset + 3] & ~0x3F) | iLevel);
-
-/* #ifdef USE_VELOCITY // Official CMF player seems to ignore velocity levels
- uint16_t iLevel = 0x2F - (iVelocity * 0x2F / 127); // 0x2F should be 0x3F but it's too quiet then
- AdPlug_LogWrite("%02X + vel %d (lev %02X) == %02X\n", this->iCurrentRegs[iOPLOffset], iVelocity, iLevel, (this->iCurrentRegs[iOPLOffset] & ~0x3F) | iLevel);
- //this->writeOPL(iOPLOffset, (this->iCurrentRegs[iOPLOffset] & ~0x3F) | (0x3F - (iVelocity >> 1)));//(iVelocity * 0x3F / 127));
- this->writeOPL(iOPLOffset, (this->iCurrentRegs[iOPLOffset] & ~0x3F) | iLevel);//(iVelocity * 0x3F / 127));
- #endif*/
-
- // Apparently you can't set the frequency for the cymbal or hihat?
- // Vinyl requires you don't set it, Kiloblaster requires you do!
- this->writeOPL(BASE_FNUM_L + iPercChannel, iOPLFNum & 0xFF);
- this->writeOPL(BASE_KEYON_FREQ + iPercChannel, (iBlock << 2) | ((iOPLFNum >> 8) & 0x03));
-
- uint8_t iBit = 1 << (15 - iChannel);
-
- // Turn the perc instrument off if it's already playing (OPL can't do
- // polyphonic notes w/ percussion)
- if (this->iCurrentRegs[BASE_RHYTHM] & iBit) this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] & ~iBit);
-
- // I wonder whether we need to delay or anything here?
-
- // Turn the note on
- //if (iChannel == 15) {
- this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] | iBit);
- //AdPlug_LogWrite("CMF: Note %d on MIDI channel %d (mapped to OPL channel %d-1) - vel %02X, fnum %d/%d\n", iNote, iChannel, iPercChannel+1, iVelocity, iOPLFNum, iBlock);
- //}
-
- this->chOPL[iPercChannel].iNoteStart = ++this->iNoteCount;
- this->chOPL[iPercChannel].iMIDIChannel = iChannel;
- this->chOPL[iPercChannel].iMIDINote = iNote;
-
- } else { // Non rhythm-mode or a normal instrument channel
-
- // Figure out which OPL channel to play this note on
- int iOPLChannel = -1;
- int iNumChannels = this->bPercussive ? 6 : 9;
- for (int i = iNumChannels - 1; i >= 0; i--) {
- // If there's no note playing on this OPL channel, use that
- if (this->chOPL[i].iNoteStart == 0) {
- iOPLChannel = i;
- // See if this channel is already set to the instrument we want.
- if (this->chOPL[i].iMIDIPatch == this->chMIDI[iChannel].iPatch) {
- // It is, so stop searching
- break;
- } // else keep searching just in case there's a better match
- }
- }
- if (iOPLChannel == -1) {
- // All channels were in use, find the one with the longest note
- iOPLChannel = 0;
- int iEarliest = this->chOPL[0].iNoteStart;
- for (int i = 1; i < iNumChannels; i++) {
- if (this->chOPL[i].iNoteStart < iEarliest) {
- // Found a channel with a note being played for longer
- iOPLChannel = i;
- iEarliest = this->chOPL[i].iNoteStart;
- }
- }
- AdPlug_LogWrite("CMF: Too many polyphonic notes, cutting note on channel %d\n", iOPLChannel);
- }
-
- // Run through all the channels with negative notestart values - these
- // channels have had notes recently stop - and increment the counter
- // to slowly move the channel closer to being reused for a future note.
- //for (int i = 0; i < iNumChannels; i++) {
- // if (this->chOPL[i].iNoteStart < 0) this->chOPL[i].iNoteStart++;
- //}
-
- // Now the new note should be played on iOPLChannel, but see if the instrument
- // is right first.
- if (this->chOPL[iOPLChannel].iMIDIPatch != this->chMIDI[iChannel].iPatch) {
- this->MIDIchangeInstrument(iOPLChannel, iChannel, this->chMIDI[iChannel].iPatch);
- }
-
- this->chOPL[iOPLChannel].iNoteStart = ++this->iNoteCount;
- this->chOPL[iOPLChannel].iMIDIChannel = iChannel;
- this->chOPL[iOPLChannel].iMIDINote = iNote;
-
- #ifdef USE_VELOCITY // Official CMF player seems to ignore velocity levels
- // Adjust the channel volume to match the note velocity
- uint8_t iOPLOffset = BASE_SCAL_LEVL + OPLOFFSET(iChannel) + 3; // +3 == Carrier
- uint16_t iLevel = 0x2F - (iVelocity * 0x2F / 127); // 0x2F should be 0x3F but it's too quiet then
- this->writeOPL(iOPLOffset, (this->iCurrentRegs[iOPLOffset] & ~0x3F) | iLevel);
- #endif
-
- // Set the frequency and play the note
- this->writeOPL(BASE_FNUM_L + iOPLChannel, iOPLFNum & 0xFF);
- this->writeOPL(BASE_KEYON_FREQ + iOPLChannel, OPLBIT_KEYON | (iBlock << 2) | ((iOPLFNum & 0x300) >> 8));
- }
- return;
-}
-
-void CcmfPlayer::cmfNoteOff(uint8_t iChannel, uint8_t iNote, uint8_t iVelocity)
-{
- if ((iChannel > 10) && (this->bPercussive)) {
- int iOPLChannel = this->getPercChannel(iChannel);
- if (this->chOPL[iOPLChannel].iMIDINote != iNote) return; // there's a different note playing now
- this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] & ~(1 << (15 - iChannel)));
- this->chOPL[iOPLChannel].iNoteStart = 0; // channel free
- } else { // Non rhythm-mode or a normal instrument channel
- int iOPLChannel = -1;
- int iNumChannels = this->bPercussive ? 6 : 9;
- for (int i = 0; i < iNumChannels; i++) {
- if (
- (this->chOPL[i].iMIDIChannel == iChannel) &&
- (this->chOPL[i].iMIDINote == iNote) &&
- (this->chOPL[i].iNoteStart != 0)
- ) {
- // Found the note, switch it off
- this->chOPL[i].iNoteStart = 0;
- iOPLChannel = i;
- break;
- }
- }
- if (iOPLChannel == -1) return;
-
- this->writeOPL(BASE_KEYON_FREQ + iOPLChannel, this->iCurrentRegs[BASE_KEYON_FREQ + iOPLChannel] & ~OPLBIT_KEYON);
- }
- return;
-}
-
-uint8_t CcmfPlayer::getPercChannel(uint8_t iChannel)
-{
- switch (iChannel) {
- case 11: return 7-1; // Bass drum
- case 12: return 8-1; // Snare drum
- case 13: return 9-1; // Tom tom
- case 14: return 9-1; // Top cymbal
- case 15: return 8-1; // Hihat
- }
- AdPlug_LogWrite("CMF ERR: Tried to get the percussion channel from MIDI channel %d - this shouldn't happen!\n", iChannel);
- return 0;
-}
-
-
-void CcmfPlayer::MIDIchangeInstrument(uint8_t iOPLChannel, uint8_t iMIDIChannel, uint8_t iNewInstrument)
-{
- if ((iMIDIChannel > 10) && (this->bPercussive)) {
- switch (iMIDIChannel) {
- case 11: // Bass drum (operator 13+16 == channel 7 modulator+carrier)
- this->writeInstrumentSettings(7-1, 0, 0, iNewInstrument);
- this->writeInstrumentSettings(7-1, 1, 1, iNewInstrument);
- break;
- case 12: // Snare drum (operator 17 == channel 8 carrier)
- //case 15:
- this->writeInstrumentSettings(8-1, 0, 1, iNewInstrument);
-
- //
- //this->writeInstrumentSettings(8-1, 0, 0, iNewInstrument);
- break;
- case 13: // Tom tom (operator 15 == channel 9 modulator)
- //case 14:
- this->writeInstrumentSettings(9-1, 0, 0, iNewInstrument);
-
- //
- //this->writeInstrumentSettings(9-1, 0, 1, iNewInstrument);
- break;
- case 14: // Top cymbal (operator 18 == channel 9 carrier)
- this->writeInstrumentSettings(9-1, 0, 1, iNewInstrument);
- break;
- case 15: // Hi-hat (operator 14 == channel 8 modulator)
- this->writeInstrumentSettings(8-1, 0, 0, iNewInstrument);
- break;
- default:
- AdPlug_LogWrite("CMF: Invalid MIDI channel %d (not melodic and not percussive!)\n", iMIDIChannel + 1);
- break;
- }
- this->chOPL[iOPLChannel].iMIDIPatch = iNewInstrument;
- } else {
- // Standard nine OPL channels
- this->writeInstrumentSettings(iOPLChannel, 0, 0, iNewInstrument);
- this->writeInstrumentSettings(iOPLChannel, 1, 1, iNewInstrument);
- this->chOPL[iOPLChannel].iMIDIPatch = iNewInstrument;
- }
- return;
-}
-
-void CcmfPlayer::MIDIcontroller(uint8_t iChannel, uint8_t iController, uint8_t iValue)
-{
- switch (iController) {
- case 0x63:
- // Custom extension to allow CMF files to switch the AM+VIB depth on and
- // off (officially both are on, and there's no way to switch them off.)
- // Controller values:
- // 0 == AM+VIB off
- // 1 == VIB on
- // 2 == AM on
- // 3 == AM+VIB on
- if (iValue) {
- this->writeOPL(BASE_RHYTHM, (this->iCurrentRegs[BASE_RHYTHM] & ~0xC0) | (iValue << 6)); // switch AM+VIB extension on
- } else {
- this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] & ~0xC0); // switch AM+VIB extension off
- }
- AdPlug_LogWrite("CMF: AM+VIB depth change - AM %s, VIB %s\n",
- (this->iCurrentRegs[BASE_RHYTHM] & 0x80) ? "on" : "off",
- (this->iCurrentRegs[BASE_RHYTHM] & 0x40) ? "on" : "off");
- break;
- case 0x66:
- AdPlug_LogWrite("CMF: Song set marker to 0x%02X\n", iValue);
- break;
- case 0x67:
- this->bPercussive = (iValue != 0);
- if (this->bPercussive) {
- this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] | 0x20); // switch rhythm-mode on
- } else {
- this->writeOPL(BASE_RHYTHM, this->iCurrentRegs[BASE_RHYTHM] & ~0x20); // switch rhythm-mode off
- }
- AdPlug_LogWrite("CMF: Percussive/rhythm mode %s\n", this->bPercussive ? "enabled" : "disabled");
- break;
- case 0x68:
- // TODO: Shouldn't this just affect the one channel, not the whole song? -- have pitchbends for that
- this->iTranspose = iValue;
- AdPlug_LogWrite("CMF: Transposing all notes up by %d * 1/128ths of a semitone.\n", iValue);
- break;
- case 0x69:
- this->iTranspose = -iValue;
- AdPlug_LogWrite("CMF: Transposing all notes down by %d * 1/128ths of a semitone.\n", iValue);
- break;
- default:
- AdPlug_LogWrite("CMF: Unsupported MIDI controller 0x%02X, ignoring.\n", iController);
- break;
- }
- return;
-}
diff --git a/src/adplug/core/cmf.h b/src/adplug/core/cmf.h
deleted file mode 100644
index 27ed96e..0000000
--- a/src/adplug/core/cmf.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2009 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * cmf.h - CMF player by Adam Nielsen <malvineous@shikadi.net>
- */
-
-#include <stdint.h> // for uintxx_t
-#include "player.h"
-
-typedef struct {
- uint16_t iInstrumentBlockOffset;
- uint16_t iMusicOffset;
- uint16_t iTicksPerQuarterNote;
- uint16_t iTicksPerSecond;
- uint16_t iTagOffsetTitle;
- uint16_t iTagOffsetComposer;
- uint16_t iTagOffsetRemarks;
- uint8_t iChannelsInUse[16];
- uint16_t iNumInstruments;
- uint16_t iTempo;
-} CMFHEADER;
-
-typedef struct {
- uint8_t iCharMult;
- uint8_t iScalingOutput;
- uint8_t iAttackDecay;
- uint8_t iSustainRelease;
- uint8_t iWaveSel;
-} OPERATOR;
-
-typedef struct {
- OPERATOR op[2]; // 0 == modulator, 1 == carrier
- uint8_t iConnection;
-} SBI;
-
-typedef struct {
- int iPatch; // MIDI patch for this channel
- int iPitchbend; // Current pitchbend amount for this channel
-} MIDICHANNEL;
-
-typedef struct {
- int iNoteStart; // When the note started playing (longest notes get cut first, 0 == channel free)
- int iMIDINote; // MIDI note number currently being played on this OPL channel
- int iMIDIChannel; // Source MIDI channel where this note came from
- int iMIDIPatch; // Current MIDI patch set on this OPL channel
-} OPLCHANNEL;
-
-class CcmfPlayer: public CPlayer
-{
- private:
- uint8_t *data; // song data (CMF music block)
- int iPlayPointer; // Current location of playback pointer
- int iSongLen; // Max value for iPlayPointer
- CMFHEADER cmfHeader;
- SBI *pInstruments;
- bool bPercussive; // are rhythm-mode instruments enabled?
- uint8_t iCurrentRegs[256]; // Current values in the OPL chip
- int iTranspose; // Transpose amount for entire song (between -128 and +128)
- uint8_t iPrevCommand; // Previous command (used for repeated MIDI commands, as the seek and playback code need to share this)
-
- int iNoteCount; // Used to count how long notes have been playing for
- MIDICHANNEL chMIDI[16];
- OPLCHANNEL chOPL[9];
-
- // Additions for AdPlug's design
- int iDelayRemaining;
- bool bSongEnd;
- std::string strTitle, strComposer, strRemarks;
-
- public:
- static CPlayer *factory(Copl *newopl);
-
- CcmfPlayer(Copl *newopl);
- ~CcmfPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- { return std::string("Creative Music File (CMF)"); };
- std::string gettitle();
- std::string getauthor();
- std::string getdesc();
-
- protected:
- uint32_t readMIDINumber();
- void writeInstrumentSettings(uint8_t iChannel, uint8_t iOperatorSource, uint8_t iOperatorDest, uint8_t iInstrument);
- void writeOPL(uint8_t iRegister, uint8_t iValue);
- void cmfNoteOn(uint8_t iChannel, uint8_t iNote, uint8_t iVelocity);
- void cmfNoteOff(uint8_t iChannel, uint8_t iNote, uint8_t iVelocity);
- uint8_t getPercChannel(uint8_t iChannel);
- void MIDIchangeInstrument(uint8_t iOPLChannel, uint8_t iMIDIChannel, uint8_t iNewInstrument);
- void MIDIcontroller(uint8_t iChannel, uint8_t iController, uint8_t iValue);
-
-};
diff --git a/src/adplug/core/d00.cc b/src/adplug/core/d00.cc
deleted file mode 100644
index 9e90180..0000000
--- a/src/adplug/core/d00.cc
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * d00.c - D00 Player by Simon Peter <dn.tlp@gmx.net>
- *
- * NOTES:
- * Sorry for the goto's, but the code looks so much nicer now.
- * I tried it with while loops but it was just a mess. If you
- * can come up with a nicer solution, just tell me.
- *
- * BUGS:
- * Hard restart SR is sometimes wrong
- */
-
-#include <string.h>
-#include <stdio.h>
-#include <inttypes.h>
-
-#include "debug.h"
-#include "d00.h"
-
-#define HIBYTE(val) (val >> 8)
-#define LOBYTE(val) (val & 0xff)
-
-static const unsigned short notetable[12] = // D00 note table
- {340,363,385,408,432,458,485,514,544,577,611,647};
-
-static inline uint16_t LE_WORD(const uint16_t *val)
-{
- const uint8_t *b = (const uint8_t *)val;
- return (b[1] << 8) + b[0];
-}
-
-/*** public methods *************************************/
-
-CPlayer *Cd00Player::factory(Copl *newopl)
-{
- return new Cd00Player(newopl);
-}
-
-bool Cd00Player::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- d00header *checkhead;
- d00header1 *ch;
- unsigned long filesize;
- int i,ver1=0;
- char *str;
-
- // file validation section
- checkhead = new d00header;
- f->readString((char *)checkhead, sizeof(d00header));
-
- // Check for version 2-4 header
- if(strncmp(checkhead->id,"JCH\x26\x02\x66",6) || checkhead->type ||
- !checkhead->subsongs || checkhead->soundcard) {
- // Check for version 0 or 1 header (and .d00 file extension)
- delete checkhead;
- if(!fp.extension(filename, ".d00")) { fp.close(f); return false; }
- ch = new d00header1;
- f->seek(0); f->readString((char *)ch, sizeof(d00header1));
- if(ch->version > 1 || !ch->subsongs)
- { delete ch; fp.close(f); return false; }
- delete ch;
- ver1 = 1;
- } else
- delete checkhead;
-
- AdPlug_LogWrite("Cd00Player::load(f,\"%s\"): %s format D00 file detected!\n",
- filename.c_str(), ver1 ? "Old" : "New");
-
- // load section
- filesize = fp.filesize(f); f->seek(0);
- filedata = new char [filesize + 1]; // 1 byte is needed for old-style DataInfo block
- f->readString((char *)filedata, filesize);
- fp.close(f);
- if(!ver1) { // version 2 and above
- header = (struct d00header *)filedata;
- version = header->version;
- datainfo = (char *)filedata + LE_WORD(&header->infoptr);
- inst = (struct Sinsts *)((char *)filedata + LE_WORD(&header->instptr));
- seqptr = (unsigned short *)((char *)filedata + LE_WORD(&header->seqptr));
- for(i=31;i>=0;i--) // erase whitespace
- if(header->songname[i] == ' ')
- header->songname[i] = '\0';
- else
- break;
- for(i=31;i>=0;i--)
- if(header->author[i] == ' ')
- header->author[i] = '\0';
- else
- break;
- } else { // version 1
- header1 = (struct d00header1 *)filedata;
- version = header1->version;
- datainfo = (char *)filedata + LE_WORD(&header1->infoptr);
- inst = (struct Sinsts *)((char *)filedata + LE_WORD(&header1->instptr));
- seqptr = (unsigned short *)((char *)filedata + LE_WORD(&header1->seqptr));
- }
- switch(version) {
- case 0:
- levpuls = 0;
- spfx = 0;
- header1->speed = 70; // v0 files default to 70Hz
- break;
- case 1:
- levpuls = (struct Slevpuls *)((char *)filedata + LE_WORD(&header1->lpulptr));
- spfx = 0;
- break;
- case 2:
- levpuls = (struct Slevpuls *)((char *)filedata + LE_WORD(&header->spfxptr));
- spfx = 0;
- break;
- case 3:
- spfx = 0;
- levpuls = 0;
- break;
- case 4:
- spfx = (struct Sspfx *)((char *)filedata + LE_WORD(&header->spfxptr));
- levpuls = 0;
- break;
- }
- if((str = strstr(datainfo,"\xff\xff")))
- while((*str == '\xff' || *str == ' ') && str >= datainfo) {
- *str = '\0'; str--;
- }
- else // old-style block
- memset((char *)filedata+filesize,0,1);
-
- rewind(0);
- return true;
-}
-
-bool Cd00Player::update()
-{
- unsigned char c,cnt,trackend=0,fx,note;
- unsigned short ord,*patt,buf,fxop,pattpos;
-
- // effect handling (timer dependant)
- for(c=0;c<9;c++) {
- channel[c].slideval += channel[c].slide; setfreq(c); // sliding
- vibrato(c); // vibrato
-
- if(channel[c].spfx != 0xffff) { // SpFX
- if(channel[c].fxdel)
- channel[c].fxdel--;
- else {
- channel[c].spfx = LE_WORD(&spfx[channel[c].spfx].ptr);
- channel[c].fxdel = spfx[channel[c].spfx].duration;
- channel[c].inst = LE_WORD(&spfx[channel[c].spfx].instnr) & 0xfff;
- if(spfx[channel[c].spfx].modlev != 0xff)
- channel[c].modvol = spfx[channel[c].spfx].modlev;
- setinst(c);
- if(LE_WORD(&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency
- note = spfx[channel[c].spfx].halfnote;
- else // unlocked frequency
- note = spfx[channel[c].spfx].halfnote + channel[c].note;
- channel[c].freq = notetable[note%12] + ((note/12) << 10);
- setfreq(c);
- }
- channel[c].modvol += spfx[channel[c].spfx].modlevadd; channel[c].modvol &= 63;
- setvolume(c);
- }
-
- if(channel[c].levpuls != 0xff) { // Levelpuls
- if(channel[c].frameskip)
- channel[c].frameskip--;
- else {
- channel[c].frameskip = inst[channel[c].inst].timer;
- if(channel[c].fxdel)
- channel[c].fxdel--;
- else {
- channel[c].levpuls = levpuls[channel[c].levpuls].ptr - 1;
- channel[c].fxdel = levpuls[channel[c].levpuls].duration;
- if(levpuls[channel[c].levpuls].level != 0xff)
- channel[c].modvol = levpuls[channel[c].levpuls].level;
- }
- channel[c].modvol += levpuls[channel[c].levpuls].voladd; channel[c].modvol &= 63;
- setvolume(c);
- }
- }
- }
-
- // song handling
- for(c=0;c<9;c++)
- if(version < 3 ? channel[c].del : channel[c].del <= 0x7f) {
- if(version == 4) // v4: hard restart SR
- if(channel[c].del == inst[channel[c].inst].timer)
- if(channel[c].nextnote)
- opl->write(0x83 + op_table[c], inst[channel[c].inst].sr);
- if(version < 3)
- channel[c].del--;
- else
- if(channel[c].speed)
- channel[c].del += channel[c].speed;
- else {
- channel[c].seqend = 1;
- continue;
- }
- } else {
- if(channel[c].speed) {
- if(version < 3)
- channel[c].del = channel[c].speed;
- else {
- channel[c].del &= 0x7f;
- channel[c].del += channel[c].speed;
- }
- } else {
- channel[c].seqend = 1;
- continue;
- }
- if(channel[c].rhcnt) { // process pending REST/HOLD events
- channel[c].rhcnt--;
- continue;
- }
- readorder: // process arrangement (orderlist)
- ord = LE_WORD(&channel[c].order[channel[c].ordpos]);
- switch(ord) {
- case 0xfffe: channel[c].seqend = 1; continue; // end of arrangement stream
- case 0xffff: // jump to order
- channel[c].ordpos = LE_WORD(&channel[c].order[channel[c].ordpos + 1]);
- channel[c].seqend = 1;
- goto readorder;
- default:
- if(ord >= 0x9000) { // set speed
- channel[c].speed = ord & 0xff;
- ord = LE_WORD(&channel[c].order[channel[c].ordpos - 1]);
- channel[c].ordpos++;
- } else
- if(ord >= 0x8000) { // transpose track
- channel[c].transpose = ord & 0xff;
- if(ord & 0x100)
- channel[c].transpose = -channel[c].transpose;
- ord = LE_WORD(&channel[c].order[++channel[c].ordpos]);
- }
- patt = (unsigned short *)((char *)filedata + LE_WORD(&seqptr[ord]));
- break;
- }
- channel[c].fxflag = 0;
- readseq: // process sequence (pattern)
- if(!version) // v0: always initialize rhcnt
- channel[c].rhcnt = channel[c].irhcnt;
- pattpos = LE_WORD(&patt[channel[c].pattpos]);
- if(pattpos == 0xffff) { // pattern ended?
- channel[c].pattpos = 0;
- channel[c].ordpos++;
- goto readorder;
- }
- cnt = HIBYTE(pattpos);
- note = LOBYTE(pattpos);
- fx = pattpos >> 12;
- fxop = pattpos & 0x0fff;
- channel[c].pattpos++; pattpos = LE_WORD(&patt[channel[c].pattpos]);
- channel[c].nextnote = LOBYTE(pattpos) & 0x7f;
- if(version ? cnt < 0x40 : !fx) { // note event
- switch(note) {
- case 0: // REST event
- case 0x80:
- if(!note || version) {
- channel[c].key = 0;
- setfreq(c);
- }
- // fall through...
- case 0x7e: // HOLD event
- if(version)
- channel[c].rhcnt = cnt;
- channel[c].nextnote = 0;
- break;
- default: // play note
- // restart fx
- if(!(channel[c].fxflag & 1))
- channel[c].vibdepth = 0;
- if(!(channel[c].fxflag & 2))
- channel[c].slideval = channel[c].slide = 0;
-
- if(version) { // note handling for v1 and above
- if(note > 0x80) // locked note (no channel transpose)
- note -= 0x80;
- else // unlocked note
- note += channel[c].transpose;
- channel[c].note = note; // remember note for SpFX
-
- if(channel[c].ispfx != 0xffff && cnt < 0x20) { // reset SpFX
- channel[c].spfx = channel[c].ispfx;
- if(LE_WORD(&spfx[channel[c].spfx].instnr) & 0x8000) // locked frequency
- note = spfx[channel[c].spfx].halfnote;
- else // unlocked frequency
- note += spfx[channel[c].spfx].halfnote;
- channel[c].inst = LE_WORD(&spfx[channel[c].spfx].instnr) & 0xfff;
- channel[c].fxdel = spfx[channel[c].spfx].duration;
- if(spfx[channel[c].spfx].modlev != 0xff)
- channel[c].modvol = spfx[channel[c].spfx].modlev;
- else
- channel[c].modvol = inst[channel[c].inst].data[7] & 63;
- }
-
- if(channel[c].ilevpuls != 0xff && cnt < 0x20) { // reset LevelPuls
- channel[c].levpuls = channel[c].ilevpuls;
- channel[c].fxdel = levpuls[channel[c].levpuls].duration;
- channel[c].frameskip = inst[channel[c].inst].timer;
- if(levpuls[channel[c].levpuls].level != 0xff)
- channel[c].modvol = levpuls[channel[c].levpuls].level;
- else
- channel[c].modvol = inst[channel[c].inst].data[7] & 63;
- }
-
- channel[c].freq = notetable[note%12] + ((note/12) << 10);
- if(cnt < 0x20) // normal note
- playnote(c);
- else { // tienote
- setfreq(c);
- cnt -= 0x20; // make count proper
- }
- channel[c].rhcnt = cnt;
- } else { // note handling for v0
- if(cnt < 2) // unlocked note
- note += channel[c].transpose;
- channel[c].note = note;
-
- channel[c].freq = notetable[note%12] + ((note/12) << 10);
- if(cnt == 1) // tienote
- setfreq(c);
- else // normal note
- playnote(c);
- }
- break;
- }
- continue; // event is complete
- } else { // effect event
- switch(fx) {
- case 6: // Cut/Stop Voice
- buf = channel[c].inst;
- channel[c].inst = 0;
- playnote(c);
- channel[c].inst = buf;
- channel[c].rhcnt = fxop;
- continue; // no note follows this event
- case 7: // Vibrato
- channel[c].vibspeed = fxop & 0xff;
- channel[c].vibdepth = fxop >> 8;
- channel[c].trigger = fxop >> 9;
- channel[c].fxflag |= 1;
- break;
- case 8: // v0: Duration
- if(!version)
- channel[c].irhcnt = fxop;
- break;
- case 9: // New Level
- channel[c].vol = fxop & 63;
- if(channel[c].vol + channel[c].cvol < 63) // apply channel volume
- channel[c].vol += channel[c].cvol;
- else
- channel[c].vol = 63;
- setvolume(c);
- break;
- case 0xb: // v4: Set SpFX
- if(version == 4)
- channel[c].ispfx = fxop;
- break;
- case 0xc: // Set Instrument
- channel[c].ispfx = 0xffff;
- channel[c].spfx = 0xffff;
- channel[c].inst = fxop;
- channel[c].modvol = inst[fxop].data[7] & 63;
- if(version < 3 && version && inst[fxop].tunelev) // Set LevelPuls
- channel[c].ilevpuls = inst[fxop].tunelev - 1;
- else {
- channel[c].ilevpuls = 0xff;
- channel[c].levpuls = 0xff;
- }
- break;
- case 0xd: // Slide up
- channel[c].slide = fxop;
- channel[c].fxflag |= 2;
- break;
- case 0xe: // Slide down
- channel[c].slide = -fxop;
- channel[c].fxflag |= 2;
- break;
- }
- goto readseq; // event is incomplete, note follows
- }
- }
-
- for(c=0;c<9;c++)
- if(channel[c].seqend)
- trackend++;
- if(trackend == 9)
- songend = 1;
-
- return !songend;
-}
-
-void Cd00Player::rewind(int subsong)
-{
- struct Stpoin {
- unsigned short ptr[9];
- unsigned char volume[9],dummy[5];
- } *tpoin;
- int i;
-
- if(subsong == -1) subsong = cursubsong;
-
- if(version > 1) { // do nothing if subsong > number of subsongs
- if(subsong >= header->subsongs)
- return;
- } else
- if(subsong >= header1->subsongs)
- return;
-
- memset(channel,0,sizeof(channel));
- if(version > 1)
- tpoin = (struct Stpoin *)((char *)filedata + LE_WORD(&header->tpoin));
- else
- tpoin = (struct Stpoin *)((char *)filedata + LE_WORD(&header1->tpoin));
- for(i=0;i<9;i++) {
- if(LE_WORD(&tpoin[subsong].ptr[i])) { // track enabled
- channel[i].speed = LE_WORD((unsigned short *)
- ((char *)filedata + LE_WORD(&tpoin[subsong].ptr[i])));
- channel[i].order = (unsigned short *)
- ((char *)filedata + LE_WORD(&tpoin[subsong].ptr[i]) + 2);
- } else { // track disabled
- channel[i].speed = 0;
- channel[i].order = 0;
- }
- channel[i].ispfx = 0xffff; channel[i].spfx = 0xffff; // no SpFX
- channel[i].ilevpuls = 0xff; channel[i].levpuls = 0xff; // no LevelPuls
- channel[i].cvol = tpoin[subsong].volume[i] & 0x7f; // our player may savely ignore bit 7
- channel[i].vol = channel[i].cvol; // initialize volume
- }
- songend = 0;
- opl->init(); opl->write(1,32); // reset OPL chip
- cursubsong = subsong;
-}
-
-std::string Cd00Player::gettype()
-{
- char tmpstr[40];
-
- sprintf(tmpstr,"EdLib packed (version %d)",version > 1 ? header->version : header1->version);
- return std::string(tmpstr);
-}
-
-float Cd00Player::getrefresh()
-{
- if(version > 1)
- return header->speed;
- else
- return header1->speed;
-}
-
-unsigned int Cd00Player::getsubsongs()
-{
- if(version <= 1) // return number of subsongs
- return header1->subsongs;
- else
- return header->subsongs;
-}
-
-/*** private methods *************************************/
-
-void Cd00Player::setvolume(unsigned char chan)
-{
- unsigned char op = op_table[chan];
- unsigned short insnr = channel[chan].inst;
-
- opl->write(0x43 + op,(int)(63-((63-(inst[insnr].data[2] & 63))/63.0)*(63-channel[chan].vol)) +
- (inst[insnr].data[2] & 192));
- if(inst[insnr].data[10] & 1)
- opl->write(0x40 + op,(int)(63-((63-channel[chan].modvol)/63.0)*(63-channel[chan].vol)) +
- (inst[insnr].data[7] & 192));
- else
- opl->write(0x40 + op,channel[chan].modvol + (inst[insnr].data[7] & 192));
-}
-
-void Cd00Player::setfreq(unsigned char chan)
-{
- unsigned short freq = channel[chan].freq;
-
- if(version == 4) // v4: apply instrument finetune
- freq += inst[channel[chan].inst].tunelev;
-
- freq += channel[chan].slideval;
- opl->write(0xa0 + chan, freq & 255);
- if(channel[chan].key)
- opl->write(0xb0 + chan, ((freq >> 8) & 31) | 32);
- else
- opl->write(0xb0 + chan, (freq >> 8) & 31);
-}
-
-void Cd00Player::setinst(unsigned char chan)
-{
- unsigned char op = op_table[chan];
- unsigned short insnr = channel[chan].inst;
-
- // set instrument data
- opl->write(0x63 + op, inst[insnr].data[0]);
- opl->write(0x83 + op, inst[insnr].data[1]);
- opl->write(0x23 + op, inst[insnr].data[3]);
- opl->write(0xe3 + op, inst[insnr].data[4]);
- opl->write(0x60 + op, inst[insnr].data[5]);
- opl->write(0x80 + op, inst[insnr].data[6]);
- opl->write(0x20 + op, inst[insnr].data[8]);
- opl->write(0xe0 + op, inst[insnr].data[9]);
- if(version)
- opl->write(0xc0 + chan, inst[insnr].data[10]);
- else
- opl->write(0xc0 + chan, (inst[insnr].data[10] << 1) + (inst[insnr].tunelev & 1));
-}
-
-void Cd00Player::playnote(unsigned char chan)
-{
- // set misc vars & play
- opl->write(0xb0 + chan, 0); // stop old note
- setinst(chan);
- channel[chan].key = 1;
- setfreq(chan);
- setvolume(chan);
-}
-
-void Cd00Player::vibrato(unsigned char chan)
-{
- if(!channel[chan].vibdepth)
- return;
-
- if(channel[chan].trigger)
- channel[chan].trigger--;
- else {
- channel[chan].trigger = channel[chan].vibdepth;
- channel[chan].vibspeed = -channel[chan].vibspeed;
- }
- channel[chan].freq += channel[chan].vibspeed;
- setfreq(chan);
-}
diff --git a/src/adplug/core/d00.h b/src/adplug/core/d00.h
deleted file mode 100644
index 8737d76..0000000
--- a/src/adplug/core/d00.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * d00.h - D00 Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_D00
-#define H_D00
-
-#include "player.h"
-
-class Cd00Player: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- Cd00Player(Copl *newopl)
- : CPlayer(newopl), filedata(0)
- { };
- ~Cd00Player()
- { if(filedata) delete [] filedata; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle()
- { if(version > 1) return std::string(header->songname); else return std::string(); };
- std::string getauthor()
- { if(version > 1) return std::string(header->author); else return std::string(); };
- std::string getdesc()
- { if(*datainfo) return std::string(datainfo); else return std::string(); };
- unsigned int getsubsongs();
-
- protected:
-#pragma pack(1)
- struct d00header {
- char id[6];
- unsigned char type,version,speed,subsongs,soundcard;
- char songname[32],author[32],dummy[32];
- unsigned short tpoin,seqptr,instptr,infoptr,spfxptr,endmark;
- };
-
- struct d00header1 {
- unsigned char version,speed,subsongs;
- unsigned short tpoin,seqptr,instptr,infoptr,lpulptr,endmark;
- };
-#pragma pack()
-
- struct {
- unsigned short *order,ordpos,pattpos,del,speed,rhcnt,key,freq,inst,
- spfx,ispfx,irhcnt;
- signed short transpose,slide,slideval,vibspeed;
- unsigned char seqend,vol,vibdepth,fxdel,modvol,cvol,levpuls,
- frameskip,nextnote,note,ilevpuls,trigger,fxflag;
- } channel[9];
-
- struct Sinsts {
- unsigned char data[11],tunelev,timer,sr,dummy[2];
- } *inst;
-
- struct Sspfx {
- unsigned short instnr;
- signed char halfnote;
- unsigned char modlev;
- signed char modlevadd;
- unsigned char duration;
- unsigned short ptr;
- } *spfx;
-
- struct Slevpuls {
- unsigned char level;
- signed char voladd;
- unsigned char duration,ptr;
- } *levpuls;
-
- unsigned char songend,version,cursubsong;
- char *datainfo;
- unsigned short *seqptr;
- d00header *header;
- d00header1 *header1;
- char *filedata;
-
- private:
- void setvolume(unsigned char chan);
- void setfreq(unsigned char chan);
- void setinst(unsigned char chan);
- void playnote(unsigned char chan);
- void vibrato(unsigned char chan);
-};
-
-#endif
diff --git a/src/adplug/core/database.cc b/src/adplug/core/database.cc
deleted file mode 100644
index d4a27e1..0000000
--- a/src/adplug/core/database.cc
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (c) 1999 - 2006 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * database.cpp - AdPlug database class
- * Copyright (c) 2002 Riven the Mage <riven@ok.ru>
- * Copyright (c) 2002, 2003, 2006 Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "binio.h"
-#include "binfile.h"
-#include <string.h>
-
-#include "database.h"
-
-#define DB_FILEID_V10 "AdPlug Module Information Database 1.0\x10"
-
-/***** CAdPlugDatabase *****/
-
-const unsigned short CAdPlugDatabase::hash_radix = 0xfff1; // should be prime
-
-CAdPlugDatabase::CAdPlugDatabase()
- : linear_index(0), linear_logic_length(0), linear_length(0)
-{
- db_linear = new DB_Bucket * [hash_radix];
- db_hashed = new DB_Bucket * [hash_radix];
- memset(db_linear, 0, sizeof(DB_Bucket *) * hash_radix);
- memset(db_hashed, 0, sizeof(DB_Bucket *) * hash_radix);
-}
-
-CAdPlugDatabase::~CAdPlugDatabase()
-{
- unsigned long i;
-
- for(i = 0; i < linear_length; i++)
- delete db_linear[i];
-
- delete [] db_linear;
- delete [] db_hashed;
-}
-
-bool CAdPlugDatabase::load(std::string db_name)
-{
- binifstream f(db_name);
- if(f.error()) return false;
- return load(f);
-}
-
-bool CAdPlugDatabase::load(binistream &f)
-{
- unsigned int idlen = strlen(DB_FILEID_V10);
- char *id = new char [idlen];
- unsigned long length;
-
- // Open database as little endian with IEEE floats
- f.setFlag(binio::BigEndian, false); f.setFlag(binio::FloatIEEE);
-
- f.readString(id,idlen);
- if(memcmp(id,DB_FILEID_V10,idlen)) {
- delete [] id;
- return false;
- }
- delete [] id;
- length = f.readInt(4);
-
- // read records
- for(unsigned long i = 0; i < length; i++)
- insert(CRecord::factory(f));
-
- return true;
-}
-
-bool CAdPlugDatabase::save(std::string db_name)
-{
- binofstream f(db_name);
- if(f.error()) return false;
- return save(f);
-}
-
-bool CAdPlugDatabase::save(binostream &f)
-{
- unsigned long i;
-
- // Save database as little endian with IEEE floats
- f.setFlag(binio::BigEndian, false); f.setFlag(binio::FloatIEEE);
-
- f.writeString(DB_FILEID_V10);
- f.writeInt(linear_logic_length, 4);
-
- // write records
- for(i = 0; i < linear_length; i++)
- if(!db_linear[i]->deleted)
- db_linear[i]->record->write(f);
-
- return true;
-}
-
-CAdPlugDatabase::CRecord *CAdPlugDatabase::search(CKey const &key)
-{
- if(lookup(key)) return get_record(); else return 0;
-}
-
-bool CAdPlugDatabase::lookup(CKey const &key)
-{
- unsigned long index = make_hash(key);
- if(!db_hashed[index]) return false;
-
- // immediate hit ?
- DB_Bucket *bucket = db_hashed[index];
-
- if(!bucket->deleted && bucket->record->key == key) {
- linear_index = bucket->index;
- return true;
- }
-
- // in-chain hit ?
- bucket = db_hashed[index]->chain;
-
- while(bucket) {
- if(!bucket->deleted && bucket->record->key == key) {
- linear_index = bucket->index;
- return true;
- }
-
- bucket = bucket->chain;
- }
-
- return false;
-}
-
-bool CAdPlugDatabase::insert(CRecord *record)
-{
- long index;
-
- // sanity checks
- if(!record) return false; // null-pointer given
- if(linear_length == hash_radix) return false; // max. db size exceeded
- if(lookup(record->key)) return false; // record already in db
-
- // make bucket
- DB_Bucket *bucket = new DB_Bucket(linear_length, record);
- if(!bucket) return false;
-
- // add to linear list
- db_linear[linear_length] = bucket;
- linear_logic_length++; linear_length++;
-
- // add to hashed list
- index = make_hash(record->key);
-
- if(!db_hashed[index]) // First entry in hashtable
- db_hashed[index] = bucket;
- else { // Add entry in chained list
- DB_Bucket *chain = db_hashed[index];
-
- while(chain->chain) chain = chain->chain;
- chain->chain = bucket;
- }
-
- return true;
-}
-
-void CAdPlugDatabase::wipe(CRecord *record)
-{
- if(!lookup(record->key)) return;
- wipe();
-}
-
-void CAdPlugDatabase::wipe()
-{
- if(!linear_length) return;
-
- DB_Bucket *bucket = db_linear[linear_index];
-
- if(!bucket->deleted) {
- delete bucket->record;
- linear_logic_length--;
- bucket->deleted = true;
- }
-}
-
-CAdPlugDatabase::CRecord *CAdPlugDatabase::get_record()
-{
- if(!linear_length) return 0;
- return db_linear[linear_index]->record;
-}
-
-bool CAdPlugDatabase::go_forward()
-{
- if(linear_index + 1 < linear_length) {
- linear_index++;
- return true;
- } else
- return false;
-}
-
-bool CAdPlugDatabase::go_backward()
-{
- if(!linear_index) return false;
- linear_index--;
- return true;
-}
-
-void CAdPlugDatabase::goto_begin()
-{
- if(linear_length) linear_index = 0;
-}
-
-void CAdPlugDatabase::goto_end()
-{
- if(linear_length) linear_index = linear_length - 1;
-}
-
-inline unsigned long CAdPlugDatabase::make_hash(CKey const &key)
-{
- return (key.crc32 + key.crc16) % hash_radix;
-}
-
-/***** CAdPlugDatabase::DB_Bucket *****/
-
-CAdPlugDatabase::DB_Bucket::DB_Bucket(unsigned long nindex, CRecord *newrecord, DB_Bucket *newchain)
- : index(nindex), deleted(false), chain(newchain), record(newrecord)
-{
-}
-
-CAdPlugDatabase::DB_Bucket::~DB_Bucket()
-{
- if(!deleted) delete record;
-}
-
-/***** CAdPlugDatabase::CRecord *****/
-
-CAdPlugDatabase::CRecord *CAdPlugDatabase::CRecord::factory(RecordType type)
-{
- switch(type) {
- case Plain: return new CPlainRecord;
- case SongInfo: return new CInfoRecord;
- case ClockSpeed: return new CClockRecord;
- default: return 0;
- }
-}
-
-CAdPlugDatabase::CRecord *CAdPlugDatabase::CRecord::factory(binistream &in)
-{
- RecordType type;
- unsigned long size;
- CRecord *rec;
-
- type = (RecordType)in.readInt(1); size = in.readInt(4);
- rec = factory(type);
-
- if(rec) {
- rec->key.crc16 = in.readInt(2); rec->key.crc32 = in.readInt(4);
- rec->filetype = in.readString('\0'); rec->comment = in.readString('\0');
- rec->read_own(in);
- return rec;
- } else {
- // skip this record, cause we don't know about it
- in.seek(size, binio::Add);
- return 0;
- }
-}
-
-void CAdPlugDatabase::CRecord::write(binostream &out)
-{
- out.writeInt(type, 1);
- out.writeInt(get_size() + filetype.length() + comment.length() + 8, 4);
- out.writeInt(key.crc16, 2); out.writeInt(key.crc32, 4);
- out.writeString(filetype); out.writeInt('\0', 1);
- out.writeString(comment); out.writeInt('\0', 1);
-
- write_own(out);
-}
-
-bool CAdPlugDatabase::CRecord::user_read(std::istream &in, std::ostream &out)
-{
- return user_read_own(in, out);
-}
-
-bool CAdPlugDatabase::CRecord::user_write(std::ostream &out)
-{
- out << "Record type: ";
- switch(type) {
- case Plain: out << "Plain"; break;
- case SongInfo: out << "SongInfo"; break;
- case ClockSpeed: out << "ClockSpeed"; break;
- default: out << "*** Unknown ***"; break;
- }
- out << std::endl;
- out << "Key: " << std::hex << key.crc16 << ":" << key.crc32 << std::dec << std::endl;
- out << "File type: " << filetype << std::endl;
- out << "Comment: " << comment << std::endl;
-
- return user_write_own(out);
-}
-
-/***** CAdPlugDatabase::CRecord::CKey *****/
-
-CAdPlugDatabase::CKey::CKey(binistream &buf)
-{
- make(buf);
-}
-
-bool CAdPlugDatabase::CKey::operator==(const CKey &key)
-{
- return ((crc16 == key.crc16) && (crc32 == key.crc32));
-}
-
-void CAdPlugDatabase::CKey::make(binistream &buf)
-// Key is CRC16:CRC32 pair. CRC16 and CRC32 calculation routines (c) Zhengxi
-{
- static const unsigned short magic16 = 0xa001;
- static const unsigned long magic32 = 0xedb88320;
-
- crc16 = 0; crc32 = ~0;
-
- while(!buf.eof())
- {
- unsigned char byte = buf.readInt(1);
-
- for (int j=0;j<8;j++)
- {
- if ((crc16 ^ byte) & 1)
- crc16 = (crc16 >> 1) ^ magic16;
- else
- crc16 >>= 1;
-
- if ((crc32 ^ byte) & 1)
- crc32 = (crc32 >> 1) ^ magic32;
- else
- crc32 >>= 1;
-
- byte >>= 1;
- }
- }
-
- crc16 &= 0xffff;
- crc32 = ~crc32;
-}
-
-/***** CInfoRecord *****/
-
-CInfoRecord::CInfoRecord()
-{
- type = SongInfo;
-}
-
-void CInfoRecord::read_own(binistream &in)
-{
- title = in.readString('\0');
- author = in.readString('\0');
-}
-
-void CInfoRecord::write_own(binostream &out)
-{
- out.writeString(title); out.writeInt('\0', 1);
- out.writeString(author); out.writeInt('\0', 1);
-}
-
-unsigned long CInfoRecord::get_size()
-{
- return title.length() + author.length() + 2;
-}
-
-bool CInfoRecord::user_read_own(std::istream &in, std::ostream &out)
-{
- out << "Title: "; in >> title;
- out << "Author: "; in >> author;
- return true;
-}
-
-bool CInfoRecord::user_write_own(std::ostream &out)
-{
- out << "Title: " << title << std::endl;
- out << "Author: " << author << std::endl;
- return true;
-}
-
-/***** CClockRecord *****/
-
-CClockRecord::CClockRecord()
- : clock(0.0f)
-{
- type = ClockSpeed;
-}
-
-void CClockRecord::read_own(binistream &in)
-{
- clock = in.readFloat(binio::Single);
-}
-
-void CClockRecord::write_own(binostream &out)
-{
- out.writeFloat(clock, binio::Single);
-}
-
-unsigned long CClockRecord::get_size()
-{
- return 4;
-}
-
-bool CClockRecord::user_read_own(std::istream &in, std::ostream &out)
-{
- out << "Clockspeed: "; in >> clock;
- return true;
-}
-
-bool CClockRecord::user_write_own(std::ostream &out)
-{
- out << "Clock speed: " << clock << " Hz" << std::endl;
- return true;
-}
diff --git a/src/adplug/core/database.h b/src/adplug/core/database.h
deleted file mode 100644
index e7e03ee..0000000
--- a/src/adplug/core/database.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (c) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * database.h - AdPlug database class
- * Copyright (c) 2002 Riven the Mage <riven@ok.ru>
- * Copyright (c) 2002, 2003 Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_DATABASE
-#define H_ADPLUG_DATABASE
-
-#include <iostream>
-#include <string>
-#include "binio.h"
-
-class CAdPlugDatabase
-{
-public:
- class CKey
- {
- public:
- unsigned short crc16;
- unsigned long crc32;
-
- CKey() {};
- CKey(binistream &in);
-
- bool operator==(const CKey &key);
-
- private:
- void make(binistream &in);
- };
-
- class CRecord
- {
- public:
- typedef enum { Plain, SongInfo, ClockSpeed } RecordType;
-
- RecordType type;
- CKey key;
- std::string filetype, comment;
-
- static CRecord *factory(RecordType type);
- static CRecord *factory(binistream &in);
-
- CRecord() {}
- virtual ~CRecord() {}
-
- void write(binostream &out);
-
- bool user_read(std::istream &in, std::ostream &out);
- bool user_write(std::ostream &out);
-
- protected:
- virtual void read_own(binistream &in) = 0;
- virtual void write_own(binostream &out) = 0;
- virtual unsigned long get_size() = 0;
- virtual bool user_read_own(std::istream &in, std::ostream &out) = 0;
- virtual bool user_write_own(std::ostream &out) = 0;
- };
-
- CAdPlugDatabase();
- ~CAdPlugDatabase();
-
- bool load(std::string db_name);
- bool load(binistream &f);
- bool save(std::string db_name);
- bool save(binostream &f);
-
- bool insert(CRecord *record);
-
- void wipe(CRecord *record);
- void wipe();
-
- CRecord *search(CKey const &key);
- bool lookup(CKey const &key);
-
- CRecord *get_record();
-
- bool go_forward();
- bool go_backward();
-
- void goto_begin();
- void goto_end();
-
-private:
- static const unsigned short hash_radix;
-
- class DB_Bucket
- {
- public:
- unsigned long index;
- bool deleted;
- DB_Bucket *chain;
-
- CRecord *record;
-
- DB_Bucket(unsigned long nindex, CRecord *newrecord, DB_Bucket *newchain = 0);
- ~DB_Bucket();
- };
-
- DB_Bucket **db_linear;
- DB_Bucket **db_hashed;
-
- unsigned long linear_index, linear_logic_length, linear_length;
-
- unsigned long make_hash(CKey const &key);
-};
-
-class CPlainRecord: public CAdPlugDatabase::CRecord
-{
-public:
- CPlainRecord() { type = Plain; }
-
-protected:
- virtual void read_own(binistream &in) {}
- virtual void write_own(binostream &out) {}
- virtual unsigned long get_size() { return 0; }
- virtual bool user_read_own(std::istream &in, std::ostream &out) { return true; }
- virtual bool user_write_own(std::ostream &out) { return true; }
-};
-
-class CInfoRecord: public CAdPlugDatabase::CRecord
-{
-public:
- std::string title;
- std::string author;
-
- CInfoRecord();
-
-protected:
- virtual void read_own(binistream &in);
- virtual void write_own(binostream &out);
- virtual unsigned long get_size();
- virtual bool user_read_own(std::istream &in, std::ostream &out);
- virtual bool user_write_own(std::ostream &out);
-};
-
-class CClockRecord: public CAdPlugDatabase::CRecord
-{
-public:
- float clock;
-
- CClockRecord();
-
-protected:
- virtual void read_own(binistream &in);
- virtual void write_own(binostream &out);
- virtual unsigned long get_size();
- virtual bool user_read_own(std::istream &in, std::ostream &out);
- virtual bool user_write_own(std::ostream &out);
-};
-
-#endif
diff --git a/src/adplug/core/debug.h b/src/adplug/core/debug.h
deleted file mode 100644
index c8a72a7..0000000
--- a/src/adplug/core/debug.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2002 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * debug.h - AdPlug Debug Logger
- * Copyright (c) 2002 Riven the Mage <riven@ok.ru>
- * Copyright (c) 2002 Simon Peter <dn.tlp@gmx.net>
- *
- * NOTES:
- * This debug logger is used throughout AdPlug to log debug output to stderr
- * (the default) or to a user-specified logfile.
- *
- * To use it, AdPlug has to be compiled with debug logging support enabled.
- * This is done by defining the DEBUG macro with every source-file. The
- * LogFile() function can be used to specify a logfile to write to.
- */
-
-#ifndef H_DEBUG
-#define H_DEBUG
-
-#include <libaudcore/runtime.h>
-
-#define AdPlug_LogWrite(...) AUDDBG(__VA_ARGS__)
-
-#endif
diff --git a/src/adplug/core/dfm.cc b/src/adplug/core/dfm.cc
deleted file mode 100644
index 7a81f88..0000000
--- a/src/adplug/core/dfm.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dfm.cpp - Digital-FM Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include "dfm.h"
-#include "debug.h"
-
-CPlayer *CdfmLoader::factory(Copl *newopl)
-{
- return new CdfmLoader(newopl);
-}
-
-bool CdfmLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- unsigned char npats,n,note,fx,c,r,param;
- unsigned int i;
- const unsigned char convfx[8] = {255,255,17,19,23,24,255,13};
-
- // file validation
- f->readString(header.id, 4);
- header.hiver = f->readInt(1); header.lover = f->readInt(1);
- if(strncmp(header.id,"DFM\x1a",4) || header.hiver > 1)
- { fp.close(f); return false; }
-
- // load
- restartpos = 0; flags = Standard; bpm = 0;
- init_trackord();
- f->readString(songinfo, 33);
- initspeed = f->readInt(1);
- for(i = 0; i < 32; i++)
- f->readString(instname[i], 12);
- for(i = 0; i < 32; i++) {
- inst[i].data[1] = f->readInt(1);
- inst[i].data[2] = f->readInt(1);
- inst[i].data[9] = f->readInt(1);
- inst[i].data[10] = f->readInt(1);
- inst[i].data[3] = f->readInt(1);
- inst[i].data[4] = f->readInt(1);
- inst[i].data[5] = f->readInt(1);
- inst[i].data[6] = f->readInt(1);
- inst[i].data[7] = f->readInt(1);
- inst[i].data[8] = f->readInt(1);
- inst[i].data[0] = f->readInt(1);
- }
- for(i = 0; i < 128; i++) order[i] = f->readInt(1);
- for(i = 0; i < 128 && order[i] != 128; i++) continue;
- length = i;
- npats = f->readInt(1);
- for(i = 0; i < npats; i++) {
- n = f->readInt(1);
- for(r = 0; r < 64; r++)
- for(c = 0; c < 9; c++) {
- note = f->readInt(1);
- if((note & 15) == 15)
- tracks[n*9+c][r].note = 127; // key off
- else
- tracks[n*9+c][r].note = ((note & 127) >> 4) * 12 + (note & 15);
- if(note & 128) { // additional effect byte
- fx = f->readInt(1);
- if(fx >> 5 == 1)
- tracks[n*9+c][r].inst = (fx & 31) + 1;
- else {
- tracks[n*9+c][r].command = convfx[fx >> 5];
- if(tracks[n*9+c][r].command == 17) { // set volume
- param = fx & 31;
- param = 63 - param * 2;
- tracks[n*9+c][r].param1 = param >> 4;
- tracks[n*9+c][r].param2 = param & 15;
- } else {
- tracks[n*9+c][r].param1 = (fx & 31) >> 4;
- tracks[n*9+c][r].param2 = fx & 15;
- }
- }
- }
-
- }
- }
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-std::string CdfmLoader::gettype()
-{
- char tmpstr[20];
-
- sprintf(tmpstr,"Digital-FM %d.%d",header.hiver,header.lover);
- return std::string(tmpstr);
-}
-
-float CdfmLoader::getrefresh()
-{
- return 125.0f;
-}
diff --git a/src/adplug/core/dfm.h b/src/adplug/core/dfm.h
deleted file mode 100644
index fa46833..0000000
--- a/src/adplug/core/dfm.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dfm.h - Digital-FM Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "protrack.h"
-
-class CdfmLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CdfmLoader(Copl *newopl)
- : CmodPlayer(newopl)
- { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype();
- unsigned int getinstruments()
- { return 32; };
- std::string getinstrument(unsigned int n)
- { if(*instname[n]) return std::string(instname[n],1,*instname[n]); else return std::string(); };
- std::string getdesc()
- { return std::string(songinfo,1,*songinfo); };
-
-private:
- struct {
- char id[4];
- unsigned char hiver,lover;
- } header;
-
- char songinfo[33];
- char instname[32][12];
-};
diff --git a/src/adplug/core/dmo.cc b/src/adplug/core/dmo.cc
deleted file mode 100644
index 72c0450..0000000
--- a/src/adplug/core/dmo.cc
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2004, 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- dmo.cpp - TwinTeam loader by Riven the Mage <riven@ok.ru>
-*/
-/*
- NOTES:
- Panning is ignored.
-
- A WORD ist 16 bits, a DWORD is 32 bits and a BYTE is 8 bits in this context.
-*/
-
-#include <string.h>
-#include "binstr.h"
-
-#include "dmo.h"
-#include "debug.h"
-
-#define LOWORD(l) ((l) & 0xffff)
-#define HIWORD(l) ((l) >> 16)
-#define LOBYTE(w) ((w) & 0xff)
-#define HIBYTE(w) ((w) >> 8)
-
-#define ARRAY_AS_DWORD(a, i) \
-((a[i + 3] << 24) + (a[i + 2] << 16) + (a[i + 1] << 8) + a[i])
-#define ARRAY_AS_WORD(a, i) ((a[i + 1] << 8) + a[i])
-
-#define CHARP_AS_WORD(p) (((*(p + 1)) << 8) + (*p))
-
-/* -------- Public Methods -------------------------------- */
-
-CPlayer *CdmoLoader::factory(Copl *newopl)
-{
- return new CdmoLoader(newopl);
-}
-
-bool CdmoLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- int i,j;
- binistream *f;
-
- // check header
- dmo_unpacker *unpacker = new dmo_unpacker;
- unsigned char chkhdr[16];
-
- if (!fp.extension(filename, ".dmo"))
- {
- delete unpacker;
- return false;
- }
-
- f = fp.open(filename);
- if (!f)
- {
- delete unpacker;
- return false;
- }
-
- f->readString((char *)chkhdr, 16);
-
- if (!unpacker->decrypt(chkhdr, 16))
- {
- delete unpacker;
- fp.close(f);
- return false;
- }
-
- // get file size
- long packed_length = fp.filesize(f);
- f->seek(0);
-
- unsigned char *packed_module = new unsigned char [packed_length];
-
- // load file
- f->readString((char *)packed_module, packed_length);
- fp.close(f);
-
- // decrypt
- unpacker->decrypt(packed_module,packed_length);
-
- long unpacked_length = 0x2000 * ARRAY_AS_WORD(packed_module, 12);
- unsigned char *module = new unsigned char [unpacked_length];
-
- // unpack
- if (!unpacker->unpack(packed_module+12,module,unpacked_length))
- {
- delete unpacker;
- delete [] packed_module;
- delete [] module;
- return false;
- }
-
- delete unpacker;
- delete [] packed_module;
-
- // "TwinTeam" - signed ?
- if (memcmp(module,"TwinTeam Module File""\x0D\x0A",22))
- {
- delete [] module;
- return false;
- }
-
- // load header
- binisstream uf(module, unpacked_length);
- uf.setFlag(binio::BigEndian, false); uf.setFlag(binio::FloatIEEE);
-
- memset(&header,0,sizeof(s3mheader));
-
- uf.ignore(22); // ignore DMO header ID string
- uf.readString(header.name, 28);
-
- uf.ignore(2); // _unk_1
- header.ordnum = uf.readInt(2);
- header.insnum = uf.readInt(2);
- header.patnum = uf.readInt(2);
- uf.ignore(2); // _unk_2
- header.is = uf.readInt(2);
- header.it = uf.readInt(2);
-
- memset(header.chanset,0xFF,32);
-
- for (i=0;i<9;i++)
- header.chanset[i] = 0x10 + i;
-
- uf.ignore(32); // ignore panning settings for all 32 channels
-
- // load orders
- for(i = 0; i < 256; i++) orders[i] = uf.readInt(1);
-
- orders[header.ordnum] = 0xFF;
-
- // load pattern lengths
- unsigned short my_patlen[100];
- for(i = 0; i < 100; i++) my_patlen[i] = uf.readInt(2);
-
- // load instruments
- for (i = 0; i < header.insnum; i++)
- {
- memset(&inst[i],0,sizeof(s3minst));
-
- uf.readString(inst[i].name, 28);
-
- inst[i].volume = uf.readInt(1);
- inst[i].dsk = uf.readInt(1);
- inst[i].c2spd = uf.readInt(4);
- inst[i].type = uf.readInt(1);
- inst[i].d00 = uf.readInt(1);
- inst[i].d01 = uf.readInt(1);
- inst[i].d02 = uf.readInt(1);
- inst[i].d03 = uf.readInt(1);
- inst[i].d04 = uf.readInt(1);
- inst[i].d05 = uf.readInt(1);
- inst[i].d06 = uf.readInt(1);
- inst[i].d07 = uf.readInt(1);
- inst[i].d08 = uf.readInt(1);
- inst[i].d09 = uf.readInt(1);
- inst[i].d0a = uf.readInt(1);
- /*
- * Originally, riven sets d0b = d0a and ignores 1 byte in the
- * stream, but i guess this was a typo, so i read it here.
- */
- inst[i].d0b = uf.readInt(1);
- }
-
- // load patterns
- for (i = 0; i < header.patnum; i++) {
- long cur_pos = uf.pos();
-
- for (j = 0; j < 64; j++) {
- while (1) {
- unsigned char token = uf.readInt(1);
-
- if (!token)
- break;
-
- unsigned char chan = token & 31;
-
- // note + instrument ?
- if (token & 32) {
- unsigned char bufbyte = uf.readInt(1);
-
- pattern[i][j][chan].note = bufbyte & 15;
- pattern[i][j][chan].oct = bufbyte >> 4;
- pattern[i][j][chan].instrument = uf.readInt(1);
- }
-
- // volume ?
- if (token & 64)
- pattern[i][j][chan].volume = uf.readInt(1);
-
- // command ?
- if (token & 128) {
- pattern[i][j][chan].command = uf.readInt(1);
- pattern[i][j][chan].info = uf.readInt(1);
- }
- }
- }
-
- uf.seek(cur_pos + my_patlen[i]);
- }
-
- delete [] module;
- rewind(0);
- return true;
-}
-
-std::string CdmoLoader::gettype()
-{
- return std::string("TwinTeam (packed S3M)");
-}
-
-std::string CdmoLoader::getauthor()
-{
- /*
- All available .DMO modules written by one composer. And because all .DMO
- stuff was lost due to hd crash (TwinTeam guys said this), there are
- never(?) be another.
- */
- return std::string("Benjamin GERARDIN");
-}
-
-/* -------- Private Methods ------------------------------- */
-
-unsigned short CdmoLoader::dmo_unpacker::brand(unsigned short range)
-{
- unsigned short ax,bx,cx,dx;
-
- ax = LOWORD(bseed);
- bx = HIWORD(bseed);
- cx = ax;
- ax = LOWORD(cx * 0x8405);
- dx = HIWORD(cx * 0x8405);
- cx <<= 3;
- cx = (((HIBYTE(cx) + LOBYTE(cx)) & 0xFF) << 8) + LOBYTE(cx);
- dx += cx;
- dx += bx;
- bx <<= 2;
- dx += bx;
- dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx);
- bx <<= 5;
- dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx);
- ax += 1;
- if (!ax) dx += 1;
-
- // leave it that way or amd64 might get it wrong
- bseed = dx;
- bseed <<= 16;
- bseed += ax;
-
- return HIWORD(HIWORD(LOWORD(bseed) * range) + HIWORD(bseed) * range);
-}
-
-bool CdmoLoader::dmo_unpacker::decrypt(unsigned char *buf, long len)
-{
- unsigned long seed = 0;
- int i;
-
- bseed = ARRAY_AS_DWORD(buf, 0);
-
- for (i=0; i < ARRAY_AS_WORD(buf, 4) + 1; i++)
- seed += brand(0xffff);
-
- bseed = seed ^ ARRAY_AS_DWORD(buf, 6);
-
- if (ARRAY_AS_WORD(buf, 10) != brand(0xffff))
- return false;
-
- for (i=0;i<(len-12);i++)
- buf[12+i] ^= brand(0x100);
-
- buf[len - 2] = buf[len - 1] = 0;
-
- return true;
-}
-
-short CdmoLoader::dmo_unpacker::unpack_block(unsigned char *ibuf, long ilen, unsigned char *obuf)
-{
- unsigned char code,par1,par2;
- unsigned short ax,bx,cx;
-
- unsigned char *ipos = ibuf;
- unsigned char *opos = obuf;
-
- // LZ77 child
- while (ipos - ibuf < ilen)
- {
- code = *ipos++;
-
- // 00xxxxxx: copy (xxxxxx + 1) bytes
- if ((code >> 6) == 0)
- {
- cx = (code & 0x3F) + 1;
-
- if(opos + cx >= oend)
- return -1;
-
- for (int i=0;i<cx;i++)
- *opos++ = *ipos++;
-
- continue;
- }
-
- // 01xxxxxx xxxyyyyy: copy (Y + 3) bytes from (X + 1)
- if ((code >> 6) == 1)
- {
- par1 = *ipos++;
-
- ax = ((code & 0x3F) << 3) + ((par1 & 0xE0) >> 5) + 1;
- cx = (par1 & 0x1F) + 3;
-
- if(opos + cx >= oend)
- return -1;
-
- for(int i=0;i<cx;i++) {
- *opos = *(opos - ax);
- opos++;
- }
-
- continue;
- }
-
- // 10xxxxxx xyyyzzzz: copy (Y + 3) bytes from (X + 1); copy Z bytes
- if ((code >> 6) == 2)
- {
- int i;
-
- par1 = *ipos++;
-
- ax = ((code & 0x3F) << 1) + (par1 >> 7) + 1;
- cx = ((par1 & 0x70) >> 4) + 3;
- bx = par1 & 0x0F;
-
- if(opos + bx + cx >= oend)
- return -1;
-
- for(i=0;i<cx;i++) {
- *opos = *(opos - ax);
- opos++;
- }
-
- for (i=0;i<bx;i++)
- *opos++ = *ipos++;
-
- continue;
- }
-
- // 11xxxxxx xxxxxxxy yyyyzzzz: copy (Y + 4) from X; copy Z bytes
- if ((code >> 6) == 3)
- {
- int i;
-
- par1 = *ipos++;
- par2 = *ipos++;
-
- bx = ((code & 0x3F) << 7) + (par1 >> 1);
- cx = ((par1 & 0x01) << 4) + (par2 >> 4) + 4;
- ax = par2 & 0x0F;
-
- if(opos + ax + cx >= oend)
- return -1;
-
- for(i=0;i<cx;i++) {
- *opos = *(opos - bx);
- opos++;
- }
-
- for (i=0;i<ax;i++)
- *opos++ = *ipos++;
-
- continue;
- }
- }
-
- return opos - obuf;
-}
-
-long CdmoLoader::dmo_unpacker::unpack(unsigned char *ibuf, unsigned char *obuf,
- unsigned long outputsize)
-{
- long olen = 0;
- unsigned short block_count = CHARP_AS_WORD(ibuf);
-
- ibuf += 2;
- unsigned char *block_length = ibuf;
- ibuf += 2 * block_count;
-
- oend = obuf + outputsize;
-
- for (int i=0;i<block_count;i++)
- {
- unsigned short bul = CHARP_AS_WORD(ibuf);
-
- if(unpack_block(ibuf + 2,CHARP_AS_WORD(block_length) - 2,obuf) != bul)
- return 0;
-
- obuf += bul;
- olen += bul;
-
- ibuf += CHARP_AS_WORD(block_length);
- block_length += 2;
- }
-
- return olen;
-}
diff --git a/src/adplug/core/dmo.h b/src/adplug/core/dmo.h
deleted file mode 100644
index 63b6b85..0000000
--- a/src/adplug/core/dmo.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- dmo.cpp - TwinTeam loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include "s3m.h"
-
-class CdmoLoader: public Cs3mPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CdmoLoader(Copl *newopl) : Cs3mPlayer(newopl) { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
-
- std::string gettype();
- std::string getauthor();
-
- private:
-
- class dmo_unpacker {
- public:
- bool decrypt(unsigned char *buf, long len);
- long unpack(unsigned char *ibuf, unsigned char *obuf,
- unsigned long outputsize);
-
- private:
- unsigned short brand(unsigned short range);
- short unpack_block(unsigned char *ibuf, long ilen, unsigned char *obuf);
-
- unsigned long bseed;
- unsigned char *oend;
- };
-};
diff --git a/src/adplug/core/dro.cc b/src/adplug/core/dro.cc
deleted file mode 100644
index 179ddf3..0000000
--- a/src/adplug/core/dro.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dro.c - DOSBox Raw OPL Player by Sjoerd van der Berg <harekiet@zophar.net>
- *
- * upgraded by matthew gambrell <zeromus@zeromus.org>
- *
- * NOTES: 3-oct-04: the DRO format is not yet finalized. beware.
- */
-
-#include <cstring>
-#include <stdio.h>
-
-#include "dro.h"
-
-/*** public methods *************************************/
-
-CPlayer *CdroPlayer::factory(Copl *newopl)
-{
- return new CdroPlayer(newopl);
-}
-
-CdroPlayer::CdroPlayer(Copl *newopl)
- : CPlayer(newopl), data(0)
-{
- if(opl->gettype() == Copl::TYPE_OPL2)
- opl3_mode = 0;
- else
- opl3_mode = 1;
-}
-
-bool CdroPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[8];
- unsigned long i;
-
- // file validation section
- f->readString(id, 8);
- if(strncmp(id,"DBRAWOPL",8)) { fp.close (f); return false; }
- int version = f->readInt(4); // not very useful just yet
- if(version != 0x10000) { fp.close(f); return false; }
-
- // load section
- mstotal = f->readInt(4); // Total milliseconds in file
- length = f->readInt(4); // Total data bytes in file
- data = new unsigned char [length];
-
- f->ignore(1); // Type of opl data this can contain - ignored
- for (i=0;i<3;i++)
- data[i]=f->readInt(1);
-
- if ((data[0] == 0) || (data[1] == 0) || (data[2] == 0)) {
- // Some early .DRO files only used one byte for the hardware type, then
- // later changed to four bytes with no version number change. If we're
- // here then this is a later (more popular) file with the full four bytes
- // for the hardware-type.
- i = 0; // so ignore the three bytes we just read and start again
- }
- for (;i<length;i++)
- data[i]=f->readInt(1);
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CdroPlayer::update()
-{
- if (delay>500) {
- delay-=500;
- return true;
- } else
- delay=0;
-
- while (pos < length) {
- unsigned char cmd = data[pos++];
- switch(cmd) {
- case 0:
- delay = 1 + data[pos++];
- return true;
- case 1:
- delay = 1 + data[pos] + (data[pos+1]<<8);
- pos+=2;
- return true;
- case 2:
- index = 0;
- opl->setchip(0);
- break;
- case 3:
- index = 1;
- opl->setchip(1);
- break;
- default:
- if(cmd==4) cmd = data[pos++]; //data override
- if(index == 0 || opl3_mode)
- opl->write(cmd,data[pos++]);
- break;
- }
- }
-
- return pos<length;
-}
-
-void CdroPlayer::rewind(int subsong)
-{
- delay=1;
- pos = index = 0;
- opl->init();
-
- //dro assumes all registers are initialized to 0
- //registers not initialized to 0 will be corrected
- //in the data stream
- for(int i=0;i<256;i++)
- opl->write(i,0);
-
- opl->setchip(1);
- for(int i=0;i<256;i++)
- opl->write(i,0);
- opl->setchip(0);
-}
-
-float CdroPlayer::getrefresh()
-{
- if (delay > 500) return 1000 / 500;
- else return 1000 / (double)delay;
-}
diff --git a/src/adplug/core/dro.h b/src/adplug/core/dro.h
deleted file mode 100644
index bcc23a6..0000000
--- a/src/adplug/core/dro.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dro.h - DOSBox Raw OPL Player by Sjoerd van der Berg <harekiet@zophar.net>
- */
-
-#include "player.h"
-
-class CdroPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CdroPlayer(Copl *newopl);
- ~CdroPlayer()
- {
- if(data)
- delete [] data;
- }
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- {
- return std::string("DOSBox Raw OPL v0.1");
- }
-
- protected:
- unsigned char *data;
- unsigned long pos,length;
- unsigned long msdone,mstotal;
- unsigned short delay;
- unsigned char index, opl3_mode;
-};
diff --git a/src/adplug/core/dro2.cc b/src/adplug/core/dro2.cc
deleted file mode 100644
index 94a5a05..0000000
--- a/src/adplug/core/dro2.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dro2.cpp - DOSBox Raw OPL v2.0 player by Adam Nielsen <malvineous@shikadi.net>
- */
-
-#include <cstring>
-#include <stdio.h>
-
-#include "dro2.h"
-
-CPlayer *Cdro2Player::factory(Copl *newopl)
-{
- return new Cdro2Player(newopl);
-}
-
-Cdro2Player::Cdro2Player(Copl *newopl) :
- CPlayer(newopl),
- piConvTable(NULL),
- data(0)
-{
-}
-
-Cdro2Player::~Cdro2Player()
-{
- if (this->data) delete[] this->data;
- if (this->piConvTable) delete[] this->piConvTable;
-}
-
-bool Cdro2Player::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename);
- if (!f) return false;
-
- char id[8];
- f->readString(id, 8);
- if (strncmp(id, "DBRAWOPL", 8)) {
- fp.close(f);
- return false;
- }
- int version = f->readInt(4);
- if (version != 0x2) {
- fp.close(f);
- return false;
- }
-
- this->iLength = f->readInt(4) * 2; // stored in file as number of byte pairs
- f->ignore(4); // Length in milliseconds
- f->ignore(1); /// OPL type (0 == OPL2, 1 == Dual OPL2, 2 == OPL3)
- int iFormat = f->readInt(1);
- if (iFormat != 0) {
- fp.close(f);
- return false;
- }
- int iCompression = f->readInt(1);
- if (iCompression != 0) {
- fp.close(f);
- return false;
- }
- this->iCmdDelayS = f->readInt(1);
- this->iCmdDelayL = f->readInt(1);
- this->iConvTableLen = f->readInt(1);
-
- this->piConvTable = new uint8_t[this->iConvTableLen];
- f->readString((char *)this->piConvTable, this->iConvTableLen);
-
- this->data = new uint8_t[this->iLength];
- f->readString((char *)this->data, this->iLength);
-
- fp.close(f);
- rewind(0);
-
- return true;
-}
-
-bool Cdro2Player::update()
-{
- while (this->iPos < this->iLength) {
- int iIndex = this->data[this->iPos++];
- int iValue = this->data[this->iPos++];
-
- // Short delay
- if (iIndex == this->iCmdDelayS) {
- this->iDelay = iValue + 1;
- return true;
-
- // Long delay
- } else if (iIndex == this->iCmdDelayL) {
- this->iDelay = (iValue + 1) << 8;
- return true;
-
- // Normal write
- } else {
- if (iIndex & 0x80) {
- // High bit means use second chip in dual-OPL2 config
- this->opl->setchip(1);
- iIndex &= 0x7F;
- } else {
- this->opl->setchip(0);
- }
- if (iIndex > this->iConvTableLen) {
- printf("DRO2: Error - index beyond end of codemap table! Corrupted .dro?\n");
- return false; // EOF
- }
- int iReg = this->piConvTable[iIndex];
- this->opl->write(iReg, iValue);
- }
-
- }
-
- // This won't result in endless-play using Adplay, but IMHO that code belongs
- // in Adplay itself, not here.
- return this->iPos < this->iLength;
-}
-
-void Cdro2Player::rewind(int subsong)
-{
- this->iDelay = 0;
- this->iPos = 0;
- opl->init();
-}
-
-float Cdro2Player::getrefresh()
-{
- if (this->iDelay > 0) return 1000.0 / this->iDelay;
- else return 1000.0;
-}
diff --git a/src/adplug/core/dro2.h b/src/adplug/core/dro2.h
deleted file mode 100644
index a7b3d33..0000000
--- a/src/adplug/core/dro2.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * dro2.h - DOSBox Raw OPL v2.0 player by Adam Nielsen <malvineous@shikadi.net>
- */
-
-#include <stdint.h> // for uintxx_t
-#include "player.h"
-
-class Cdro2Player: public CPlayer
-{
- protected:
- uint8_t iCmdDelayS, iCmdDelayL;
- int iConvTableLen;
- uint8_t *piConvTable;
-
- uint8_t *data;
- int iLength;
- int iPos;
- int iDelay;
-
-
- public:
- static CPlayer *factory(Copl *newopl);
-
- Cdro2Player(Copl *newopl);
- ~Cdro2Player();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- {
- return std::string("DOSBox Raw OPL v2.0");
- }
-
- protected:
- //unsigned char *data;
- //unsigned long pos,length;
- //unsigned long msdone,mstotal;
- //unsigned short delay;
- //unsigned char index, opl3_mode;
-};
diff --git a/src/adplug/core/dtm.cc b/src/adplug/core/dtm.cc
deleted file mode 100644
index 4a4a130..0000000
--- a/src/adplug/core/dtm.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- dtm.cpp - DTM loader by Riven the Mage <riven@ok.ru>
-*/
-/*
- NOTE: Panning (Ex) effect is ignored.
-*/
-
-#include <cstring>
-#include "dtm.h"
-
-/* -------- Public Methods -------------------------------- */
-
-CPlayer *CdtmLoader::factory(Copl *newopl)
-{
- return new CdtmLoader(newopl);
-}
-
-bool CdtmLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- const unsigned char conv_inst[11] = { 2,1,10,9,4,3,6,5,0,8,7 };
- const unsigned short conv_note[12] = { 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287, 0x2AE };
- int i,j,k,t=0;
-
- // read header
- f->readString(header.id, 12);
- header.version = f->readInt(1);
- f->readString(header.title, 20); f->readString(header.author, 20);
- header.numpat = f->readInt(1); header.numinst = f->readInt(1);
-
- // signature exists ? good version ?
- if(memcmp(header.id,"DeFy DTM ",9) || header.version != 0x10)
- { fp.close (f); return false; }
-
- header.numinst++;
-
- // load description
- memset(desc,0,80*16);
-
- char bufstr[80];
-
- for (i=0;i<16;i++)
- {
- // get line length
- unsigned char bufstr_length = f->readInt(1);
-
- if(bufstr_length > 80) {
- fp.close(f);
- return false;
- }
-
- // read line
- if (bufstr_length)
- {
- f->readString(bufstr,bufstr_length);
-
- for (j=0;j<bufstr_length;j++)
- if (!bufstr[j])
- bufstr[j] = 0x20;
-
- bufstr[bufstr_length] = 0;
-
- strcat(desc,bufstr);
- }
-
- strcat(desc,"\n");
- }
-
- // init CmodPlayer
- realloc_instruments(header.numinst);
- realloc_order(100);
- realloc_patterns(header.numpat,64,9);
- init_notetable(conv_note);
- init_trackord();
-
- // load instruments
- for (i=0;i<header.numinst;i++)
- {
- unsigned char name_length = f->readInt(1);
-
- if (name_length)
- f->readString(instruments[i].name, name_length);
-
- instruments[i].name[name_length] = 0;
-
- for(j = 0; j < 12; j++)
- instruments[i].data[j] = f->readInt(1);
-
- for (j=0;j<11;j++)
- inst[i].data[conv_inst[j]] = instruments[i].data[j];
- }
-
- // load order
- for(i = 0; i < 100; i++) order[i] = f->readInt(1);
-
- nop = header.numpat;
-
- unsigned char *pattern = new unsigned char [0x480];
-
- // load tracks
- for (i=0;i<nop;i++)
- {
- unsigned short packed_length;
-
- packed_length = f->readInt(2);
-
- unsigned char *packed_pattern = new unsigned char [packed_length];
-
- for(j = 0; j < packed_length; j++)
- packed_pattern[j] = f->readInt(1);
-
- long unpacked_length = unpack_pattern(packed_pattern,packed_length,pattern,0x480);
-
- delete [] packed_pattern;
-
- if (!unpacked_length)
- {
- delete [] pattern;
- fp.close(f);
- return false;
- }
-
- // convert pattern
- for (j=0;j<9;j++)
- {
- for (k=0;k<64;k++)
- {
- dtm_event *event = (dtm_event *)&pattern[(k*9+j)*2];
-
- // instrument
- if (event->byte0 == 0x80)
- {
- if (event->byte1 <= 0x80)
- tracks[t][k].inst = event->byte1 + 1;
- }
-
- // note + effect
- else
- {
- tracks[t][k].note = event->byte0;
-
- if ((event->byte0 != 0) && (event->byte0 != 127))
- tracks[t][k].note++;
-
- // convert effects
- switch (event->byte1 >> 4)
- {
- case 0x0: // pattern break
- if ((event->byte1 & 15) == 1)
- tracks[t][k].command = 13;
- break;
-
- case 0x1: // freq. slide up
- tracks[t][k].command = 28;
- tracks[t][k].param1 = event->byte1 & 15;
- break;
-
- case 0x2: // freq. slide down
- tracks[t][k].command = 28;
- tracks[t][k].param2 = event->byte1 & 15;
- break;
-
- case 0xA: // set carrier volume
- case 0xC: // set instrument volume
- tracks[t][k].command = 22;
- tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4;
- tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15;
- break;
-
- case 0xB: // set modulator volume
- tracks[t][k].command = 21;
- tracks[t][k].param1 = (0x3F - (event->byte1 & 15)) >> 4;
- tracks[t][k].param2 = (0x3F - (event->byte1 & 15)) & 15;
- break;
-
- case 0xE: // set panning
- break;
-
- case 0xF: // set speed
- tracks[t][k].command = 13;
- tracks[t][k].param2 = event->byte1 & 15;
- break;
- }
- }
- }
-
- t++;
- }
- }
-
- delete [] pattern;
- fp.close(f);
-
- // order length
- for (i=0;i<100;i++)
- {
- if (order[i] >= 0x80)
- {
- length = i;
-
- if (order[i] == 0xFF)
- restartpos = 0;
- else
- restartpos = order[i] - 0x80;
-
- break;
- }
- }
-
- // initial speed
- initspeed = 2;
-
- rewind(0);
-
- return true;
-}
-
-void CdtmLoader::rewind(int subsong)
-{
- CmodPlayer::rewind(subsong);
-
- // default instruments
- for (int i=0;i<9;i++)
- {
- channel[i].inst = i;
-
- channel[i].vol1 = 63 - (inst[i].data[10] & 63);
- channel[i].vol2 = 63 - (inst[i].data[9] & 63);
- }
-}
-
-float CdtmLoader::getrefresh()
-{
- return 18.2f;
-}
-
-std::string CdtmLoader::gettype()
-{
- return std::string("DeFy Adlib Tracker");
-}
-
-std::string CdtmLoader::gettitle()
-{
- return std::string(header.title);
-}
-
-std::string CdtmLoader::getauthor()
-{
- return std::string(header.author);
-}
-
-std::string CdtmLoader::getdesc()
-{
- return std::string(desc);
-}
-
-std::string CdtmLoader::getinstrument(unsigned int n)
-{
- return std::string(instruments[n].name);
-}
-
-unsigned int CdtmLoader::getinstruments()
-{
- return header.numinst;
-}
-
-/* -------- Private Methods ------------------------------- */
-
-long CdtmLoader::unpack_pattern(unsigned char *ibuf, long ilen, unsigned char *obuf, long olen)
-{
- unsigned char *input = ibuf;
- unsigned char *output = obuf;
-
- long input_length = 0;
- long output_length = 0;
-
- unsigned char repeat_byte, repeat_counter;
-
- // RLE
- while (input_length < ilen)
- {
- repeat_byte = input[input_length++];
-
- if ((repeat_byte & 0xF0) == 0xD0)
- {
- repeat_counter = repeat_byte & 15;
- repeat_byte = input[input_length++];
- }
- else
- repeat_counter = 1;
-
- for (int i=0;i<repeat_counter;i++)
- {
- if (output_length < olen)
- output[output_length++] = repeat_byte;
- }
- }
-
- return output_length;
-}
diff --git a/src/adplug/core/dtm.h b/src/adplug/core/dtm.h
deleted file mode 100644
index fdcc37e..0000000
--- a/src/adplug/core/dtm.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- dtm.h - DTM loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include "protrack.h"
-
-class CdtmLoader: public CmodPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CdtmLoader(Copl *newopl) : CmodPlayer(newopl) { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle();
- std::string getauthor();
- std::string getdesc();
- std::string getinstrument(unsigned int n);
- unsigned int getinstruments();
-
- private:
-
- struct dtm_header
- {
- char id[12];
- unsigned char version;
- char title[20];
- char author[20];
- unsigned char numpat;
- unsigned char numinst;
- } header;
-
- char desc[80*16];
-
- struct dtm_instrument
- {
- char name[13];
- unsigned char data[12];
- } instruments[128];
-
- struct dtm_event
- {
- unsigned char byte0;
- unsigned char byte1;
- };
-
- long unpack_pattern(unsigned char *ibuf, long ilen, unsigned char *obuf, long olen);
-};
diff --git a/src/adplug/core/emuopl.cc b/src/adplug/core/emuopl.cc
deleted file mode 100644
index 6e20845..0000000
--- a/src/adplug/core/emuopl.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * emuopl.cpp - Emulated OPL, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "emuopl.h"
-
-CEmuopl::CEmuopl(int rate, bool bit16, bool usestereo)
- : use16bit(bit16), stereo(usestereo), mixbufSamples(0)
-{
- opl[0] = OPLCreate(OPL_TYPE_YM3812, 3579545, rate);
- opl[1] = OPLCreate(OPL_TYPE_YM3812, 3579545, rate);
-
- currType = TYPE_DUAL_OPL2;
-
- init();
-}
-
-CEmuopl::~CEmuopl()
-{
- OPLDestroy(opl[0]); OPLDestroy(opl[1]);
-
- if(mixbufSamples) {
- delete [] mixbuf0;
- delete [] mixbuf1;
- }
-}
-
-void CEmuopl::update(short *buf, int samples)
-{
- int i;
-
- //ensure that our mix buffers are adequately sized
- if(mixbufSamples < samples) {
- if(mixbufSamples) { delete[] mixbuf0; delete[] mixbuf1; }
- mixbufSamples = samples;
-
- //*2 = make room for stereo, if we need it
- mixbuf0 = new short[samples*2];
- mixbuf1 = new short[samples*2];
- }
-
- //data should be rendered to outbuf
- //tempbuf should be used as a temporary buffer
- //if we are supposed to generate 16bit output,
- //then outbuf may point directly to the actual waveform output "buf"
- //if we are supposed to generate 8bit output,
- //then outbuf cannot point to "buf" (because there will not be enough room)
- //and so it must point to a mixbuf instead--
- //it will be reduced to 8bit and put in "buf" later
- short *outbuf;
- short *tempbuf=mixbuf0;
- short *tempbuf2=mixbuf1;
- if(use16bit) outbuf = buf;
- else outbuf = mixbuf1;
- //...there is a potentially confusing situation where mixbuf1 can be aliased.
- //beware. it is a little loony.
-
- //all of the following rendering code produces 16bit output
-
- switch(currType) {
- case TYPE_OPL2:
- //for opl2 mode:
- //render chip0 to the output buffer
- YM3812UpdateOne(opl[0],outbuf,samples);
-
- //if we are supposed to output stereo,
- //then we need to dup the mono channel
- if(stereo)
- for(i=samples-1;i>=0;i--) {
- outbuf[i*2] = outbuf[i];
- outbuf[i*2+1] = outbuf[i];
- }
- break;
-
- case TYPE_OPL3: // unsupported
- break;
-
- case TYPE_DUAL_OPL2:
- //for dual opl2 mode:
- //render each chip to a different tempbuffer
- YM3812UpdateOne(opl[0],tempbuf2,samples);
- YM3812UpdateOne(opl[1],tempbuf,samples);
-
- //output stereo:
- //then we need to interleave the two buffers
- if(stereo){
- //first, spread tempbuf's samples across left channel
- //left channel
- for(i=0;i<samples;i++)
- outbuf[i*2] = tempbuf2[i];
- //next, insert the samples from tempbuf2 into right channel
- for(i=0;i<samples;i++)
- outbuf[i*2+1] = tempbuf[i];
- } else
- //output mono:
- //then we need to mix the two buffers into buf
- for(i=0;i<samples;i++)
- outbuf[i] = (tempbuf[i]>>1) + (tempbuf2[i]>>1);
- break;
- }
-
- //now reduce to 8bit if we need to
- if(!use16bit)
- for(i=0;i<(stereo ? samples*2 : samples);i++)
- ((char *)buf)[i] = (outbuf[i] >> 8) ^ 0x80;
-}
-
-void CEmuopl::write(int reg, int val)
-{
- switch(currType){
- case TYPE_OPL2:
- case TYPE_DUAL_OPL2:
- OPLWrite(opl[currChip], 0, reg);
- OPLWrite(opl[currChip], 1, val);
- break;
- case TYPE_OPL3: // unsupported
- break;
- }
-}
-
-void CEmuopl::init()
-{
- OPLResetChip(opl[0]); OPLResetChip(opl[1]);
- currChip = 0;
-}
-
-void CEmuopl::settype(ChipType type)
-{
- currType = type;
-}
diff --git a/src/adplug/core/emuopl.h b/src/adplug/core/emuopl.h
deleted file mode 100644
index e65d49e..0000000
--- a/src/adplug/core/emuopl.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * emuopl.h - Emulated OPL, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_EMUOPL
-#define H_ADPLUG_EMUOPL
-
-#include "opl.h"
-#include "fmopl.h"
-
-class CEmuopl: public Copl
-{
- public:
- CEmuopl(int rate, bool bit16, bool usestereo); // rate = sample rate
- virtual ~CEmuopl();
-
- void update(short *buf, int samples); // fill buffer
- void write(int reg, int val);
-
- void init();
- void settype(ChipType type);
-
- private:
- bool use16bit, stereo;
- FM_OPL *opl[2]; // OPL2 emulator data
- short *mixbuf0, *mixbuf1;
- int mixbufSamples;
-};
-
-#endif
diff --git a/src/adplug/core/flash.cc b/src/adplug/core/flash.cc
deleted file mode 100644
index cc63729..0000000
--- a/src/adplug/core/flash.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] FLASH player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : LA-INTRO.EXE
- type : Lunatic Asylum BBStro
- tune : by Rogue [Logic Design]
- player : by Flash [Logic Design]
-*/
-
-#include "flash.h"
-#include "debug.h"
-
-const unsigned char CxadflashPlayer::flash_adlib_registers[99] =
-{
- 0x23, 0x20, 0x43, 0x40, 0x63, 0x60, 0x83, 0x80, 0xC0, 0xE3, 0xE0,
- 0x24, 0x21, 0x44, 0x41, 0x64, 0x61, 0x84, 0x81, 0xC1, 0xE4, 0xE1,
- 0x25, 0x22, 0x45, 0x42, 0x65, 0x62, 0x85, 0x82, 0xC2, 0xE5, 0xE2,
- 0x2B, 0x28, 0x4B, 0x48, 0x6B, 0x68, 0x8B, 0x88, 0xC3, 0xEB, 0xE8,
- 0x2C, 0x29, 0x4C, 0x49, 0x6C, 0x69, 0x8C, 0x89, 0xC4, 0xEC, 0xE9,
- 0x2D, 0x2A, 0x4D, 0x4A, 0x6D, 0x6A, 0x8D, 0x8A, 0xC5, 0xED, 0xEA,
- 0x33, 0x30, 0x53, 0x50, 0x73, 0x70, 0x93, 0x90, 0xC6, 0xF3, 0xF0,
- 0x34, 0x31, 0x54, 0x51, 0x74, 0x71, 0x94, 0x91, 0xC7, 0xF4, 0xF1,
- 0x35, 0x32, 0x55, 0x52, 0x75, 0x72, 0x95, 0x92, 0xC8, 0xF5, 0xF2
-};
-
-const unsigned short CxadflashPlayer::flash_notes_encoded[268] =
-{
- 0x000,
- 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, 0x800, 0x900, 0xA00, 0xB00, 0xC00,
- 0x101, 0x201, 0x301, 0x401, 0x501, 0x601, 0x701, 0x801, 0x901, 0xA01, 0xB01, 0xC01,
- 0x102, 0x202, 0x302, 0x402, 0x502, 0x602, 0x702, 0x802, 0x902, 0xA02, 0xB02, 0xC02,
- 0x103, 0x203, 0x303, 0x403, 0x503, 0x603, 0x703, 0x803, 0x903, 0xA03, 0xB03, 0xC03,
- 0x104, 0x204, 0x304, 0x404, 0x504, 0x604, 0x704, 0x804, 0x904, 0xA04, 0xB04, 0xC04,
- 0x105, 0x205, 0x305, 0x405, 0x505, 0x605, 0x705, 0x805, 0x905, 0xA05, 0xB05, 0xC05,
- 0x106, 0x206, 0x306, 0x406, 0x506, 0x606, 0x706, 0x806, 0x906, 0xA06, 0xB06, 0xC06,
- 0x107, 0x207, 0x307, 0x407, 0x507, 0x607, 0x707, 0x807, 0x907, 0xA07, 0xB07, 0xC07,
- 0x108, 0x208, 0x308, 0x408, 0x508, 0x608, 0x708, 0x808, 0x908, 0xA08, 0xB08, 0xC08,
- 0x109, 0x209, 0x309, 0x409, 0x509, 0x609, 0x709, 0x809, 0x909, 0xA09, 0xB09, 0xC09,
- 0x10A, 0x20A, 0x30A, 0x40A, 0x50A, 0x60A, 0x70A, 0x80A, 0x90A, 0xA0A, 0xB0A, 0xC0A,
- 0x10B, 0x20B, 0x30B, 0x40B, 0x50B, 0x60B, 0x70B, 0x80B, 0x90B, 0xA0B, 0xB0B, 0xC0B,
- 0x10C, 0x20C, 0x30C, 0x40C, 0x50C, 0x60C, 0x70C, 0x80C, 0x90C, 0xA0C, 0xB0C, 0xC0C,
- 0x10D, 0x20D, 0x30D, 0x40D, 0x50D, 0x60D, 0x70D, 0x80D, 0x90D, 0xA0D, 0xB0D, 0xC0D,
- 0x10E, 0x20E, 0x30E, 0x40E, 0x50E, 0x60E, 0x70E, 0x80E, 0x90E, 0xA0E, 0xB0E, 0xC0E,
- 0x10F, 0x20F, 0x30F, 0x40F, 0x50F, 0x60F, 0x70F, 0x80F, 0x90F, 0xA0F, 0xB0F, 0xC0F,
- 0x110, 0x210, 0x310, 0x410, 0x510, 0x610, 0x710, 0x810, 0x910, 0xA10, 0xB10, 0xC10,
- 0x111, 0x211, 0x311, 0x411, 0x511, 0x611, 0x711, 0x811, 0x911, 0xA11, 0xB11, 0xC11,
- 0x112, 0x212, 0x312, 0x412, 0x512, 0x612, 0x712, 0x812, 0x912, 0xA12, 0xB12, 0xC12,
- 0x113, 0x213, 0x313, 0x413, 0x513, 0x613, 0x713, 0x813, 0x913, 0xA13, 0xB13, 0xC13,
- 0x114, 0x214, 0x314, 0x414, 0x514, 0x614, 0x714, 0x814, 0x914, 0xA14, 0xB14, 0xC14,
- 0x115, 0x215, 0x315
-};
-
-const unsigned short CxadflashPlayer::flash_notes[12] =
-{
- 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287
-};
-
-const unsigned char CxadflashPlayer::flash_default_instrument[8] =
-{
- 0x00, 0x00, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF
-};
-
-CPlayer *CxadflashPlayer::factory(Copl *newopl)
-{
- return new CxadflashPlayer(newopl);
-}
-
-void CxadflashPlayer::xadplayer_rewind(int subsong)
-{
- int i;
-
- plr.speed = xad.speed;
-
- flash.order_pos = 0;
- flash.pattern_pos = 0;
-
- opl_write(0x08, 0x00);
- opl_write(0xBD, 0x00);
-
- // assign default instrument
- for(i=0; i<9; i++)
- {
- opl_write(0xA0+i, 0x00);
- opl_write(0xB0+i, 0x00);
- }
-
- // assign instruments
- for(i=0; i<9; i++)
- for(int j=0; j<11; j++)
- opl_write(flash_adlib_registers[i*11+j], tune[i*12+j]);
-}
-
-void CxadflashPlayer::xadplayer_update()
-{
- unsigned short event_pos = (tune[0x600+flash.order_pos]*1152) + \
- (flash.pattern_pos*18) + \
- 0x633;
-
- for (int i=0; i<9; i++)
- {
- unsigned short flash_channel_freq = (adlib[0xB0+i] << 8) + adlib[0xA0+i];
-
- unsigned char event_b0 = tune[event_pos++];
- unsigned char event_b1 = tune[event_pos++];
-#ifdef DEBUG
- AdPlug_LogWrite("channel %02X, event %02X %02X:\n",i+1,event_b0,event_b1);
-#endif
-
- if (event_b0 == 0x80) // 0.0x80: Set Instrument
- {
- for(int j=0; j<11; j++)
- opl_write(flash_adlib_registers[i*11+j], tune[event_b1*12+j]);
- }
- else
- {
- if (event_b1 == 0x01)
- flash.pattern_pos = 0x3F; // 1.0x01: Pattern Break
-
- unsigned char fx = (event_b1 >> 4);
- unsigned char fx_p = (event_b1 & 0x0F);
-
- switch(fx)
- {
- case 0x0A: // 1.0xAy: Set Carrier volume
- opl_write(flash_adlib_registers[11*i+2], fx_p << 2);
- break;
- case 0x0B: // 1.0xBy: Set Modulator volume
- opl_write(flash_adlib_registers[11*i+3], fx_p << 2);
- break;
- case 0x0C: // 1.0xCy: Set both operators volume
- opl_write(flash_adlib_registers[11*i+2], fx_p << 2);
- opl_write(flash_adlib_registers[11*i+3], fx_p << 2);
- break;
-// case 0x0E: // 1.0xEy: ? (increase some value)
- case 0x0F: // 1.0xFy: Set Speed
- plr.speed = (fx_p + 1);
- break;
- }
-
- if (event_b0)
- {
- // mute channel
- opl_write(0xA0+i, adlib[0xA0+i]);
- opl_write(0xB0+i, adlib[0xB0+i] & 0xDF);
-
- // is note ?
- if (event_b0 != 0x7F)
- {
- unsigned short note_encoded = flash_notes_encoded[event_b0];
- unsigned short freq = flash_notes[(note_encoded >> 8) - 1];
-
- flash_channel_freq = freq | ((note_encoded & 0xFF) << 10) | 0x2000;
-
- opl_write(0xA0+i, flash_channel_freq & 0xFF);
- opl_write(0xB0+i, flash_channel_freq >> 8);
- }
- }
-
- if (fx == 0x01) // 1.0x1y: Fine Frequency Slide Up
- {
- flash_channel_freq += (fx_p << 1);
-
- opl_write(0xA0+i, flash_channel_freq & 0xFF);
- opl_write(0xB0+i, flash_channel_freq >> 8);
- }
- else if (fx == 0x02) // 1.0x2y: Fine Frequency Slide Down
- {
- flash_channel_freq -= (fx_p << 1);
-
- opl_write(0xA0+i, flash_channel_freq & 0xFF);
- opl_write(0xB0+i, flash_channel_freq >> 8);
- }
- }
- }
-
- // next row
- flash.pattern_pos++;
-
- // end of pattern ?
- if (flash.pattern_pos >= 0x40)
- {
- flash.pattern_pos = 0;
-
- flash.order_pos++;
-
- // end of module ?
- if (tune[0x600+flash.order_pos] == 0xFF)
- {
- flash.order_pos = 0;
-
- plr.looping = 1;
- }
- }
-}
-
-float CxadflashPlayer::xadplayer_getrefresh()
-{
- return 17.5f;
-}
-
-std::string CxadflashPlayer::xadplayer_gettype()
-{
- return std::string("xad: flash player");
-}
-
-unsigned int CxadflashPlayer::xadplayer_getinstruments()
-{
- return 32;
-}
diff --git a/src/adplug/core/flash.h b/src/adplug/core/flash.h
deleted file mode 100644
index 802bcb1..0000000
--- a/src/adplug/core/flash.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] FLASH player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadflashPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadflashPlayer(Copl *newopl): CxadPlayer(newopl)
- { };
-
-protected:
- struct
- {
- unsigned char order_pos;
- unsigned char pattern_pos;
- } flash;
- //
- bool xadplayer_load()
- {
- if(xad.fmt == FLASH)
- return true;
- else
- return false;
- }
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
- unsigned int xadplayer_getinstruments();
-
-private:
- static const unsigned char flash_adlib_registers[99];
- static const unsigned short flash_notes_encoded[268];
- static const unsigned short flash_notes[12];
- static const unsigned char flash_default_instrument[8];
-};
diff --git a/src/adplug/core/fmc.cc b/src/adplug/core/fmc.cc
deleted file mode 100644
index ec37972..0000000
--- a/src/adplug/core/fmc.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2007 Simon Peter <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- fmc.cpp - FMC Loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include <cstring>
-#include "fmc.h"
-
-/* -------- Public Methods -------------------------------- */
-
-CPlayer *CfmcLoader::factory(Copl *newopl)
-{
- return new CfmcLoader(newopl);
-}
-
-bool CfmcLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- const unsigned char conv_fx[16] = {0,1,2,3,4,8,255,255,255,255,26,11,12,13,14,15};
-
- int i,j,k,t=0;
-
- // read header
- f->readString(header.id, 4);
- f->readString(header.title, 21);
- header.numchan = f->readInt(1);
-
- // 'FMC!' - signed ?
- if (strncmp(header.id,"FMC!",4)) { fp.close(f); return false; }
-
- // init CmodPlayer
- realloc_instruments(32);
- realloc_order(256);
- realloc_patterns(64,64,header.numchan);
- init_trackord();
-
- // load order
- for(i = 0; i < 256; i++) order[i] = f->readInt(1);
-
- f->ignore(2);
-
- // load instruments
- for(i = 0; i < 32; i++) {
- instruments[i].synthesis = f->readInt(1);
- instruments[i].feedback = f->readInt(1);
-
- instruments[i].mod_attack = f->readInt(1);
- instruments[i].mod_decay = f->readInt(1);
- instruments[i].mod_sustain = f->readInt(1);
- instruments[i].mod_release = f->readInt(1);
- instruments[i].mod_volume = f->readInt(1);
- instruments[i].mod_ksl = f->readInt(1);
- instruments[i].mod_freq_multi = f->readInt(1);
- instruments[i].mod_waveform = f->readInt(1);
- instruments[i].mod_sustain_sound = f->readInt(1);
- instruments[i].mod_ksr = f->readInt(1);
- instruments[i].mod_vibrato = f->readInt(1);
- instruments[i].mod_tremolo = f->readInt(1);
-
- instruments[i].car_attack = f->readInt(1);
- instruments[i].car_decay = f->readInt(1);
- instruments[i].car_sustain = f->readInt(1);
- instruments[i].car_release = f->readInt(1);
- instruments[i].car_volume = f->readInt(1);
- instruments[i].car_ksl = f->readInt(1);
- instruments[i].car_freq_multi = f->readInt(1);
- instruments[i].car_waveform = f->readInt(1);
- instruments[i].car_sustain_sound = f->readInt(1);
- instruments[i].car_ksr = f->readInt(1);
- instruments[i].car_vibrato = f->readInt(1);
- instruments[i].car_tremolo = f->readInt(1);
-
- instruments[i].pitch_shift = f->readInt(1);
-
- f->readString(instruments[i].name, 21);
- }
-
- // load tracks
- for (i=0;i<64;i++)
- {
- if(f->ateof()) break;
-
- for (j=0;j<header.numchan;j++)
- {
- for (k=0;k<64;k++)
- {
- fmc_event event;
-
- // read event
- event.byte0 = f->readInt(1);
- event.byte1 = f->readInt(1);
- event.byte2 = f->readInt(1);
-
- // convert event
- tracks[t][k].note = event.byte0 & 0x7F;
- tracks[t][k].inst = ((event.byte0 & 0x80) >> 3) + (event.byte1 >> 4) + 1;
- tracks[t][k].command = conv_fx[event.byte1 & 0x0F];
- tracks[t][k].param1 = event.byte2 >> 4;
- tracks[t][k].param2 = event.byte2 & 0x0F;
-
- // fix effects
- if (tracks[t][k].command == 0x0E) // 0x0E (14): Retrig
- tracks[t][k].param1 = 3;
- if (tracks[t][k].command == 0x1A) { // 0x1A (26): Volume Slide
- if (tracks[t][k].param1 > tracks[t][k].param2)
- {
- tracks[t][k].param1 -= tracks[t][k].param2;
- tracks[t][k].param2 = 0;
- }
- else
- {
- tracks[t][k].param2 -= tracks[t][k].param1;
- tracks[t][k].param1 = 0;
- }
- }
- }
-
- t++;
- }
- }
- fp.close(f);
-
- // convert instruments
- for (i=0;i<31;i++)
- buildinst(i);
-
- // order length
- for (i=0;i<256;i++)
- {
- if (order[i] >= 0xFE)
- {
- length = i;
- break;
- }
- }
-
- // data for Protracker
- activechan = (0xffffffff >> (32 - header.numchan)) << (32 - header.numchan);
- nop = t / header.numchan;
- restartpos = 0;
-
- // flags
- flags = Faust;
-
- rewind(0);
-
- return true;
-}
-
-float CfmcLoader::getrefresh()
-{
- return 50.0f;
-}
-
-std::string CfmcLoader::gettype()
-{
- return std::string("Faust Music Creator");
-}
-
-std::string CfmcLoader::gettitle()
-{
- return std::string(header.title);
-}
-
-std::string CfmcLoader::getinstrument(unsigned int n)
-{
- return std::string(instruments[n].name);
-}
-
-unsigned int CfmcLoader::getinstruments()
-{
- return 32;
-}
-
-/* -------- Private Methods ------------------------------- */
-
-void CfmcLoader::buildinst(unsigned char i)
-{
- inst[i].data[0] = ((instruments[i].synthesis & 1) ^ 1);
- inst[i].data[0] |= ((instruments[i].feedback & 7) << 1);
-
- inst[i].data[3] = ((instruments[i].mod_attack & 15) << 4);
- inst[i].data[3] |= (instruments[i].mod_decay & 15);
- inst[i].data[5] = ((15 - (instruments[i].mod_sustain & 15)) << 4);
- inst[i].data[5] |= (instruments[i].mod_release & 15);
- inst[i].data[9] = (63 - (instruments[i].mod_volume & 63));
- inst[i].data[9] |= ((instruments[i].mod_ksl & 3) << 6);
- inst[i].data[1] = (instruments[i].mod_freq_multi & 15);
- inst[i].data[7] = (instruments[i].mod_waveform & 3);
- inst[i].data[1] |= ((instruments[i].mod_sustain_sound & 1) << 5);
- inst[i].data[1] |= ((instruments[i].mod_ksr & 1) << 4);
- inst[i].data[1] |= ((instruments[i].mod_vibrato & 1) << 6);
- inst[i].data[1] |= ((instruments[i].mod_tremolo & 1) << 7);
-
- inst[i].data[4] = ((instruments[i].car_attack & 15) << 4);
- inst[i].data[4] |= (instruments[i].car_decay & 15);
- inst[i].data[6] = ((15 - (instruments[i].car_sustain & 15)) << 4);
- inst[i].data[6] |= (instruments[i].car_release & 15);
- inst[i].data[10] = (63 - (instruments[i].car_volume & 63));
- inst[i].data[10] |= ((instruments[i].car_ksl & 3) << 6);
- inst[i].data[2] = (instruments[i].car_freq_multi & 15);
- inst[i].data[8] = (instruments[i].car_waveform & 3);
- inst[i].data[2] |= ((instruments[i].car_sustain_sound & 1) << 5);
- inst[i].data[2] |= ((instruments[i].car_ksr & 1) << 4);
- inst[i].data[2] |= ((instruments[i].car_vibrato & 1) << 6);
- inst[i].data[2] |= ((instruments[i].car_tremolo & 1) << 7);
-
- inst[i].slide = instruments[i].pitch_shift;
-}
diff --git a/src/adplug/core/fmc.h b/src/adplug/core/fmc.h
deleted file mode 100644
index cf148f5..0000000
--- a/src/adplug/core/fmc.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- fmc.h - FMC loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include "protrack.h"
-
-class CfmcLoader: public CmodPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CfmcLoader(Copl *newopl) : CmodPlayer(newopl) { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle();
- std::string getinstrument(unsigned int n);
- unsigned int getinstruments();
-
- private:
-
- struct fmc_event
- {
- unsigned char byte0;
- unsigned char byte1;
- unsigned char byte2;
- };
-
- struct fmc_header
- {
- char id[4];
- char title[21];
- unsigned char numchan;
- } header;
-
- struct fmc_instrument
- {
- unsigned char synthesis;
- unsigned char feedback;
-
- unsigned char mod_attack;
- unsigned char mod_decay;
- unsigned char mod_sustain;
- unsigned char mod_release;
- unsigned char mod_volume;
- unsigned char mod_ksl;
- unsigned char mod_freq_multi;
- unsigned char mod_waveform;
- unsigned char mod_sustain_sound;
- unsigned char mod_ksr;
- unsigned char mod_vibrato;
- unsigned char mod_tremolo;
- unsigned char car_attack;
- unsigned char car_decay;
- unsigned char car_sustain;
- unsigned char car_release;
- unsigned char car_volume;
- unsigned char car_ksl;
- unsigned char car_freq_multi;
- unsigned char car_waveform;
- unsigned char car_sustain_sound;
- unsigned char car_ksr;
- unsigned char car_vibrato;
- unsigned char car_tremolo;
-
- signed char pitch_shift;
-
- char name[21];
- } instruments[32];
-
- void buildinst(unsigned char i);
-};
diff --git a/src/adplug/core/fmopl.cc b/src/adplug/core/fmopl.cc
deleted file mode 100644
index 9a58f7a..0000000
--- a/src/adplug/core/fmopl.cc
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
-**
-** File: fmopl.c -- software implementation of FM sound generator
-**
-** Copyright (C) 1999,2000 Tatsuyuki Satoh , MultiArcadeMachineEmurator development
-**
-** Version 0.37a
-**
-*/
-
-/*
- preliminary :
- Problem :
- note:
-*/
-
-/* This version of fmopl.c is a fork of the MAME one, relicensed under the LGPL.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#define INLINE __inline
-#define HAS_YM3812 1
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <math.h>
-//#include "driver.h" /* use M.A.M.E. */
-#include "fmopl.h"
-
-#ifndef PI
-#define PI 3.14159265358979323846
-#endif
-
-/* -------------------- for debug --------------------- */
-/* #define OPL_OUTPUT_LOG */
-#ifdef OPL_OUTPUT_LOG
-static FILE *opl_dbg_fp = NULL;
-static FM_OPL *opl_dbg_opl[16];
-static int opl_dbg_maxchip,opl_dbg_chip;
-#endif
-
-/* -------------------- preliminary define section --------------------- */
-/* attack/decay rate time rate */
-#define OPL_ARRATE 141280 /* RATE 4 = 2826.24ms @ 3.6MHz */
-#define OPL_DRRATE 1956000 /* RATE 4 = 39280.64ms @ 3.6MHz */
-
-#define DELTAT_MIXING_LEVEL (1) /* DELTA-T ADPCM MIXING LEVEL */
-
-#define FREQ_BITS 24 /* frequency turn */
-
-/* counter bits = 20 , octerve 7 */
-#define FREQ_RATE (1<<(FREQ_BITS-20))
-#define TL_BITS (FREQ_BITS+2)
-
-/* final output shift , limit minimum and maximum */
-#define OPL_OUTSB (TL_BITS+3-16) /* OPL output final shift 16bit */
-#define OPL_MAXOUT (0x7fff<<OPL_OUTSB)
-#define OPL_MINOUT (-0x8000<<OPL_OUTSB)
-
-/* -------------------- quality selection --------------------- */
-
-/* sinwave entries */
-/* used static memory = SIN_ENT * 4 (byte) */
-#define SIN_ENT 2048
-
-/* output level entries (envelope,sinwave) */
-/* envelope counter lower bits */
-#define ENV_BITS 16
-/* envelope output entries */
-#define EG_ENT 4096
-/* used dynamic memory = EG_ENT*4*4(byte)or EG_ENT*6*4(byte) */
-/* used static memory = EG_ENT*4 (byte) */
-
-#define EG_OFF ((2*EG_ENT)<<ENV_BITS) /* OFF */
-#define EG_DED EG_OFF
-#define EG_DST (EG_ENT<<ENV_BITS) /* DECAY START */
-#define EG_AED EG_DST
-#define EG_AST 0 /* ATTACK START */
-
-#define EG_STEP (96.0/EG_ENT) /* OPL is 0.1875 dB step */
-
-/* LFO table entries */
-#define VIB_ENT 512
-#define VIB_SHIFT (32-9)
-#define AMS_ENT 512
-#define AMS_SHIFT (32-9)
-
-#define VIB_RATE 256
-
-/* -------------------- local defines , macros --------------------- */
-
-/* register number to channel number , slot offset */
-#define SLOT1 0
-#define SLOT2 1
-
-/* envelope phase */
-#define ENV_MOD_RR 0x00
-#define ENV_MOD_DR 0x01
-#define ENV_MOD_AR 0x02
-
-/* -------------------- tables --------------------- */
-static const int slot_array[32]=
-{
- 0, 2, 4, 1, 3, 5,-1,-1,
- 6, 8,10, 7, 9,11,-1,-1,
- 12,14,16,13,15,17,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1
-};
-
-/* key scale level */
-/* table is 3dB/OCT , DV converts this in TL step at 6dB/OCT */
-#define DV (EG_STEP/2)
-#define U(x) ((UINT32)(x))
-static const UINT32 KSL_TABLE[8*16]=
-{
- /* OCT 0 */
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- /* OCT 1 */
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 0.750/DV),U( 1.125/DV),U( 1.500/DV),
- U( 1.875/DV),U( 2.250/DV),U( 2.625/DV),U( 3.000/DV),
- /* OCT 2 */
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),
- U( 0.000/DV),U( 1.125/DV),U( 1.875/DV),U( 2.625/DV),
- U( 3.000/DV),U( 3.750/DV),U( 4.125/DV),U( 4.500/DV),
- U( 4.875/DV),U( 5.250/DV),U( 5.625/DV),U( 6.000/DV),
- /* OCT 3 */
- U( 0.000/DV),U( 0.000/DV),U( 0.000/DV),U( 1.875/DV),
- U( 3.000/DV),U( 4.125/DV),U( 4.875/DV),U( 5.625/DV),
- U( 6.000/DV),U( 6.750/DV),U( 7.125/DV),U( 7.500/DV),
- U( 7.875/DV),U( 8.250/DV),U( 8.625/DV),U( 9.000/DV),
- /* OCT 4 */
- U( 0.000/DV),U( 0.000/DV),U( 3.000/DV),U( 4.875/DV),
- U( 6.000/DV),U( 7.125/DV),U( 7.875/DV),U( 8.625/DV),
- U( 9.000/DV),U( 9.750/DV),U(10.125/DV),U(10.500/DV),
- U(10.875/DV),U(11.250/DV),U(11.625/DV),U(12.000/DV),
- /* OCT 5 */
- U( 0.000/DV),U( 3.000/DV),U( 6.000/DV),U( 7.875/DV),
- U( 9.000/DV),U(10.125/DV),U(10.875/DV),U(11.625/DV),
- U(12.000/DV),U(12.750/DV),U(13.125/DV),U(13.500/DV),
- U(13.875/DV),U(14.250/DV),U(14.625/DV),U(15.000/DV),
- /* OCT 6 */
- U( 0.000/DV),U( 6.000/DV),U( 9.000/DV),U(10.875/DV),
- U(12.000/DV),U(13.125/DV),U(13.875/DV),U(14.625/DV),
- U(15.000/DV),U(15.750/DV),U(16.125/DV),U(16.500/DV),
- U(16.875/DV),U(17.250/DV),U(17.625/DV),U(18.000/DV),
- /* OCT 7 */
- U( 0.000/DV),U( 9.000/DV),U(12.000/DV),U(13.875/DV),
- U(15.000/DV),U(16.125/DV),U(16.875/DV),U(17.625/DV),
- U(18.000/DV),U(18.750/DV),U(19.125/DV),U(19.500/DV),
- U(19.875/DV),U(20.250/DV),U(20.625/DV),U(21.000/DV)
-};
-#undef U
-#undef DV
-
-/* sustain lebel table (3db per step) */
-/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
-#define SC(db) (INT32)((db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST)
-static const INT32 SL_TABLE[16]={
- SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
- SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
-};
-#undef SC
-
-#define TL_MAX (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */
-/* TotalLevel : 48 24 12 6 3 1.5 0.75 (dB) */
-/* TL_TABLE[ 0 to TL_MAX ] : plus section */
-/* TL_TABLE[ TL_MAX to TL_MAX+TL_MAX-1 ] : minus section */
-static INT32 *TL_TABLE;
-
-/* pointers to TL_TABLE with sinwave output offset */
-static INT32 **SIN_TABLE;
-
-/* LFO table */
-static INT32 *AMS_TABLE;
-static INT32 *VIB_TABLE;
-
-/* envelope output curve table */
-/* attack + decay + OFF */
-static INT32 ENV_CURVE[2*EG_ENT+1];
-
-/* multiple table */
-#define ML 2
-static const UINT32 MUL_TABLE[16]= {
-/* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 */
- ML/2, 1*ML, 2*ML, 3*ML, 4*ML, 5*ML, 6*ML, 7*ML,
- 8*ML, 9*ML,10*ML,10*ML,12*ML,12*ML,15*ML,15*ML
-};
-#undef ML
-
-/* dummy attack / decay rate ( when rate == 0 ) */
-static INT32 RATE_0[16]=
-{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-/* -------------------- static state --------------------- */
-
-/* lock level of common table */
-static int num_lock = 0;
-
-/* work table */
-static void *cur_chip = NULL; /* current chip point */
-/* currenct chip state */
-/* static OPLSAMPLE *bufL,*bufR; */
-static OPL_CH *S_CH;
-static OPL_CH *E_CH;
-OPL_SLOT *SLOT7_1,*SLOT7_2,*SLOT8_1,*SLOT8_2;
-
-static INT32 outd[1];
-static INT32 ams;
-static INT32 vib;
-INT32 *ams_table;
-INT32 *vib_table;
-static INT32 amsIncr;
-static INT32 vibIncr;
-static INT32 feedback2; /* connect for SLOT 2 */
-
-/* log output level */
-#define LOG_ERR 3 /* ERROR */
-#define LOG_WAR 2 /* WARNING */
-#define LOG_INF 1 /* INFORMATION */
-
-//#define LOG_LEVEL LOG_INF
-#define LOG_LEVEL LOG_ERR
-
-//#define LOG(n,x) if( (n)>=LOG_LEVEL ) logerror x
-#define LOG(n,x)
-
-/* --------------------- subroutines --------------------- */
-
-INLINE int Limit( int val, int max, int min ) {
- if ( val > max )
- val = max;
- else if ( val < min )
- val = min;
-
- return val;
-}
-
-/* status set and IRQ handling */
-INLINE void OPL_STATUS_SET(FM_OPL *OPL,int flag)
-{
- /* set status flag */
- OPL->status |= flag;
- if(!(OPL->status & 0x80))
- {
- if(OPL->status & OPL->statusmask)
- { /* IRQ on */
- OPL->status |= 0x80;
- /* callback user interrupt handler (IRQ is OFF to ON) */
- if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,1);
- }
- }
-}
-
-/* status reset and IRQ handling */
-INLINE void OPL_STATUS_RESET(FM_OPL *OPL,int flag)
-{
- /* reset status flag */
- OPL->status &=~flag;
- if((OPL->status & 0x80))
- {
- if (!(OPL->status & OPL->statusmask) )
- {
- OPL->status &= 0x7f;
- /* callback user interrupt handler (IRQ is ON to OFF) */
- if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,0);
- }
- }
-}
-
-/* IRQ mask set */
-INLINE void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag)
-{
- OPL->statusmask = flag;
- /* IRQ handling check */
- OPL_STATUS_SET(OPL,0);
- OPL_STATUS_RESET(OPL,0);
-}
-
-/* ----- key on ----- */
-INLINE void OPL_KEYON(OPL_SLOT *SLOT)
-{
- /* sin wave restart */
- SLOT->Cnt = 0;
- /* set attack */
- SLOT->evm = ENV_MOD_AR;
- SLOT->evs = SLOT->evsa;
- SLOT->evc = EG_AST;
- SLOT->eve = EG_AED;
-}
-/* ----- key off ----- */
-INLINE void OPL_KEYOFF(OPL_SLOT *SLOT)
-{
- if( SLOT->evm > ENV_MOD_RR)
- {
- /* set envelope counter from envleope output */
- SLOT->evm = ENV_MOD_RR;
- if( !(SLOT->evc&EG_DST) )
- //SLOT->evc = (ENV_CURVE[SLOT->evc>>ENV_BITS]<<ENV_BITS) + EG_DST;
- SLOT->evc = EG_DST;
- SLOT->eve = EG_DED;
- SLOT->evs = SLOT->evsr;
- }
-}
-
-/* ---------- calcrate Envelope Generator & Phase Generator ---------- */
-/* return : envelope output */
-INLINE UINT32 OPL_CALC_SLOT( OPL_SLOT *SLOT )
-{
- /* calcrate envelope generator */
- if( (SLOT->evc+=SLOT->evs) >= SLOT->eve )
- {
- switch( SLOT->evm ){
- case ENV_MOD_AR: /* ATTACK -> DECAY1 */
- /* next DR */
- SLOT->evm = ENV_MOD_DR;
- SLOT->evc = EG_DST;
- SLOT->eve = SLOT->SL;
- SLOT->evs = SLOT->evsd;
- break;
- case ENV_MOD_DR: /* DECAY -> SL or RR */
- SLOT->evc = SLOT->SL;
- SLOT->eve = EG_DED;
- if(SLOT->eg_typ)
- {
- SLOT->evs = 0;
- }
- else
- {
- SLOT->evm = ENV_MOD_RR;
- SLOT->evs = SLOT->evsr;
- }
- break;
- case ENV_MOD_RR: /* RR -> OFF */
- SLOT->evc = EG_OFF;
- SLOT->eve = EG_OFF+1;
- SLOT->evs = 0;
- break;
- }
- }
- /* calcrate envelope */
- return SLOT->TLL+ENV_CURVE[SLOT->evc>>ENV_BITS]+(SLOT->ams ? ams : 0);
-}
-
-/* set algorythm connection */
-static void set_algorythm( OPL_CH *CH)
-{
- INT32 *carrier = &outd[0];
- CH->connect1 = CH->CON ? carrier : &feedback2;
- CH->connect2 = carrier;
-}
-
-/* ---------- frequency counter for operater update ---------- */
-INLINE void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT)
-{
- int ksr;
-
- /* frequency step counter */
- SLOT->Incr = CH->fc * SLOT->mul;
- ksr = CH->kcode >> SLOT->KSR;
-
- if( SLOT->ksr != ksr )
- {
- SLOT->ksr = ksr;
- /* attack , decay rate recalcration */
- SLOT->evsa = SLOT->AR[ksr];
- SLOT->evsd = SLOT->DR[ksr];
- SLOT->evsr = SLOT->RR[ksr];
- }
- SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
-}
-
-/* set multi,am,vib,EG-TYP,KSR,mul */
-INLINE void set_mul(FM_OPL *OPL,int slot,int v)
-{
- OPL_CH *CH = &OPL->P_CH[slot/2];
- OPL_SLOT *SLOT = &CH->SLOT[slot&1];
-
- SLOT->mul = MUL_TABLE[v&0x0f];
- SLOT->KSR = (v&0x10) ? 0 : 2;
- SLOT->eg_typ = (v&0x20)>>5;
- SLOT->vib = (v&0x40);
- SLOT->ams = (v&0x80);
- CALC_FCSLOT(CH,SLOT);
-}
-
-/* set ksl & tl */
-INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v)
-{
- OPL_CH *CH = &OPL->P_CH[slot/2];
- OPL_SLOT *SLOT = &CH->SLOT[slot&1];
- int ksl = v>>6; /* 0 / 1.5 / 3 / 6 db/OCT */
-
- SLOT->ksl = ksl ? 3-ksl : 31;
- SLOT->TL = (v&0x3f)*(0.75/EG_STEP); /* 0.75db step */
-
- if( !(OPL->mode&0x80) )
- { /* not CSM latch total level */
- SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
- }
-}
-
-/* set attack rate & decay rate */
-INLINE void set_ar_dr(FM_OPL *OPL,int slot,int v)
-{
- OPL_CH *CH = &OPL->P_CH[slot/2];
- OPL_SLOT *SLOT = &CH->SLOT[slot&1];
- int ar = v>>4;
- int dr = v&0x0f;
-
- SLOT->AR = ar ? &OPL->AR_TABLE[ar<<2] : RATE_0;
- SLOT->evsa = SLOT->AR[SLOT->ksr];
- if( SLOT->evm == ENV_MOD_AR ) SLOT->evs = SLOT->evsa;
-
- SLOT->DR = dr ? &OPL->DR_TABLE[dr<<2] : RATE_0;
- SLOT->evsd = SLOT->DR[SLOT->ksr];
- if( SLOT->evm == ENV_MOD_DR ) SLOT->evs = SLOT->evsd;
-}
-
-/* set sustain level & release rate */
-INLINE void set_sl_rr(FM_OPL *OPL,int slot,int v)
-{
- OPL_CH *CH = &OPL->P_CH[slot/2];
- OPL_SLOT *SLOT = &CH->SLOT[slot&1];
- int sl = v>>4;
- int rr = v & 0x0f;
-
- SLOT->SL = SL_TABLE[sl];
- if( SLOT->evm == ENV_MOD_DR ) SLOT->eve = SLOT->SL;
- SLOT->RR = &OPL->DR_TABLE[rr<<2];
- SLOT->evsr = SLOT->RR[SLOT->ksr];
- if( SLOT->evm == ENV_MOD_RR ) SLOT->evs = SLOT->evsr;
-}
-
-/* operator output calcrator */
-#define OP_OUT(slot,env,con) slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env]
-/* ---------- calcrate one of channel ---------- */
-INLINE void OPL_CALC_CH( OPL_CH *CH )
-{
- UINT32 env_out;
- OPL_SLOT *SLOT;
-
- feedback2 = 0;
- /* SLOT 1 */
- SLOT = &CH->SLOT[SLOT1];
- env_out=OPL_CALC_SLOT(SLOT);
- if( env_out < EG_ENT-1 )
- {
- /* PG */
- if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
- else SLOT->Cnt += SLOT->Incr;
- /* connectoion */
- if(CH->FB)
- {
- int feedback1 = (CH->op1_out[0]+CH->op1_out[1])>>CH->FB;
- CH->op1_out[1] = CH->op1_out[0];
- *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
- }
- else
- {
- *CH->connect1 += OP_OUT(SLOT,env_out,0);
- }
- }else
- {
- CH->op1_out[1] = CH->op1_out[0];
- CH->op1_out[0] = 0;
- }
- /* SLOT 2 */
- SLOT = &CH->SLOT[SLOT2];
- env_out=OPL_CALC_SLOT(SLOT);
- if( env_out < EG_ENT-1 )
- {
- /* PG */
- if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
- else SLOT->Cnt += SLOT->Incr;
- /* connectoion */
- outd[0] += OP_OUT(SLOT,env_out, feedback2);
- }
-}
-
-/* ---------- calcrate rythm block ---------- */
-#define WHITE_NOISE_db 6.0
-INLINE void OPL_CALC_RH( OPL_CH *CH )
-{
- UINT32 env_tam,env_sd,env_top,env_hh;
- int whitenoise = (rand()&1)*(WHITE_NOISE_db/EG_STEP);
- INT32 tone8;
-
- OPL_SLOT *SLOT;
- int env_out;
-
- /* BD : same as FM serial mode and output level is large */
- feedback2 = 0;
- /* SLOT 1 */
- SLOT = &CH[6].SLOT[SLOT1];
- env_out=OPL_CALC_SLOT(SLOT);
- if( env_out < EG_ENT-1 )
- {
- /* PG */
- if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
- else SLOT->Cnt += SLOT->Incr;
- /* connectoion */
- if(CH[6].FB)
- {
- int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB;
- CH[6].op1_out[1] = CH[6].op1_out[0];
- feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
- }
- else
- {
- feedback2 = OP_OUT(SLOT,env_out,0);
- }
- }else
- {
- feedback2 = 0;
- CH[6].op1_out[1] = CH[6].op1_out[0];
- CH[6].op1_out[0] = 0;
- }
- /* SLOT 2 */
- SLOT = &CH[6].SLOT[SLOT2];
- env_out=OPL_CALC_SLOT(SLOT);
- if( env_out < EG_ENT-1 )
- {
- /* PG */
- if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
- else SLOT->Cnt += SLOT->Incr;
- /* connectoion */
- outd[0] += OP_OUT(SLOT,env_out, feedback2)*2;
- }
-
- // SD (17) = mul14[fnum7] + white noise
- // TAM (15) = mul15[fnum8]
- // TOP (18) = fnum6(mul18[fnum8]+whitenoise)
- // HH (14) = fnum7(mul18[fnum8]+whitenoise) + white noise
- env_sd =OPL_CALC_SLOT(SLOT7_2) + whitenoise;
- env_tam=OPL_CALC_SLOT(SLOT8_1);
- env_top=OPL_CALC_SLOT(SLOT8_2);
- env_hh =OPL_CALC_SLOT(SLOT7_1) + whitenoise;
-
- /* PG */
- if(SLOT7_1->vib) SLOT7_1->Cnt += (2*SLOT7_1->Incr*vib/VIB_RATE);
- else SLOT7_1->Cnt += 2*SLOT7_1->Incr;
- if(SLOT7_2->vib) SLOT7_2->Cnt += ((CH[7].fc*8)*vib/VIB_RATE);
- else SLOT7_2->Cnt += (CH[7].fc*8);
- if(SLOT8_1->vib) SLOT8_1->Cnt += (SLOT8_1->Incr*vib/VIB_RATE);
- else SLOT8_1->Cnt += SLOT8_1->Incr;
- if(SLOT8_2->vib) SLOT8_2->Cnt += ((CH[8].fc*48)*vib/VIB_RATE);
- else SLOT8_2->Cnt += (CH[8].fc*48);
-
- tone8 = OP_OUT(SLOT8_2,whitenoise,0 );
-
- /* SD */
- if( env_sd < EG_ENT-1 )
- outd[0] += OP_OUT(SLOT7_1,env_sd, 0)*8;
- /* TAM */
- if( env_tam < EG_ENT-1 )
- outd[0] += OP_OUT(SLOT8_1,env_tam, 0)*2;
- /* TOP-CY */
- if( env_top < EG_ENT-1 )
- outd[0] += OP_OUT(SLOT7_2,env_top,tone8)*2;
- /* HH */
- if( env_hh < EG_ENT-1 )
- outd[0] += OP_OUT(SLOT7_2,env_hh,tone8)*2;
-}
-
-/* ----------- initialize time tabls ----------- */
-static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE )
-{
- int i;
- double rate;
-
- /* make attack rate & decay rate tables */
- for (i = 0;i < 4;i++) OPL->AR_TABLE[i] = OPL->DR_TABLE[i] = 0;
- for (i = 4;i <= 60;i++){
- rate = OPL->freqbase; /* frequency rate */
- if( i < 60 ) rate *= 1.0+(i&3)*0.25; /* b0-1 : x1 , x1.25 , x1.5 , x1.75 */
- rate *= 1<<((i>>2)-1); /* b2-5 : shift bit */
- rate *= (double)(EG_ENT<<ENV_BITS);
- OPL->AR_TABLE[i] = rate / ARRATE;
- OPL->DR_TABLE[i] = rate / DRRATE;
- }
- for (i = 60;i < 75;i++)
- {
- OPL->AR_TABLE[i] = EG_AED-1;
- OPL->DR_TABLE[i] = OPL->DR_TABLE[60];
- }
-#if 0
- for (i = 0;i < 64 ;i++){ /* make for overflow area */
- LOG(LOG_WAR,("rate %2d , ar %f ms , dr %f ms \n",i,
- ((double)(EG_ENT<<ENV_BITS) / OPL->AR_TABLE[i]) * (1000.0 / OPL->rate),
- ((double)(EG_ENT<<ENV_BITS) / OPL->DR_TABLE[i]) * (1000.0 / OPL->rate) ));
- }
-#endif
-}
-
-/* ---------- generic table initialize ---------- */
-static int OPLOpenTable( void )
-{
- int s,t;
- double rate;
- int i,j;
- double pom;
-
- /* allocate dynamic tables */
- if( (TL_TABLE = (INT32*)malloc(TL_MAX*2*sizeof(INT32))) == NULL)
- return 0;
- if( (SIN_TABLE = (INT32**)malloc(SIN_ENT*4 *sizeof(INT32 *))) == NULL)
- {
- free(TL_TABLE);
- return 0;
- }
- if( (AMS_TABLE = (INT32*)malloc(AMS_ENT*2 *sizeof(INT32))) == NULL)
- {
- free(TL_TABLE);
- free(SIN_TABLE);
- return 0;
- }
- if( (VIB_TABLE = (INT32*)malloc(VIB_ENT*2 *sizeof(INT32))) == NULL)
- {
- free(TL_TABLE);
- free(SIN_TABLE);
- free(AMS_TABLE);
- return 0;
- }
- /* make total level table */
- for (t = 0;t < EG_ENT-1 ;t++){
- rate = ((1<<TL_BITS)-1)/pow(10,EG_STEP*t/20); /* dB -> voltage */
- TL_TABLE[ t] = (int)rate;
- TL_TABLE[TL_MAX+t] = -TL_TABLE[t];
-/* LOG(LOG_INF,("TotalLevel(%3d) = %x\n",t,TL_TABLE[t]));*/
- }
- /* fill volume off area */
- for ( t = EG_ENT-1; t < TL_MAX ;t++){
- TL_TABLE[t] = TL_TABLE[TL_MAX+t] = 0;
- }
-
- /* make sinwave table (total level offet) */
- /* degree 0 = degree 180 = off */
- SIN_TABLE[0] = SIN_TABLE[SIN_ENT/2] = &TL_TABLE[EG_ENT-1];
- for (s = 1;s <= SIN_ENT/4;s++){
- pom = sin(2*PI*s/SIN_ENT); /* sin */
- pom = 20*log10(1/pom); /* decibel */
- j = pom / EG_STEP; /* TL_TABLE steps */
-
- /* degree 0 - 90 , degree 180 - 90 : plus section */
- SIN_TABLE[ s] = SIN_TABLE[SIN_ENT/2-s] = &TL_TABLE[j];
- /* degree 180 - 270 , degree 360 - 270 : minus section */
- SIN_TABLE[SIN_ENT/2+s] = SIN_TABLE[SIN_ENT -s] = &TL_TABLE[TL_MAX+j];
-/* LOG(LOG_INF,("sin(%3d) = %f:%f db\n",s,pom,(double)j * EG_STEP));*/
- }
- for (s = 0;s < SIN_ENT;s++)
- {
- SIN_TABLE[SIN_ENT*1+s] = s<(SIN_ENT/2) ? SIN_TABLE[s] : &TL_TABLE[EG_ENT];
- SIN_TABLE[SIN_ENT*2+s] = SIN_TABLE[s % (SIN_ENT/2)];
- SIN_TABLE[SIN_ENT*3+s] = (s/(SIN_ENT/4))&1 ? &TL_TABLE[EG_ENT] : SIN_TABLE[SIN_ENT*2+s];
- }
-
- /* envelope counter -> envelope output table */
- for (i=0; i<EG_ENT; i++)
- {
- /* ATTACK curve */
- pom = pow( ((double)(EG_ENT-1-i)/EG_ENT) , 8 ) * EG_ENT;
- /* if( pom >= EG_ENT ) pom = EG_ENT-1; */
- ENV_CURVE[i] = (int)pom;
- /* DECAY ,RELEASE curve */
- ENV_CURVE[(EG_DST>>ENV_BITS)+i]= i;
- }
- /* off */
- ENV_CURVE[EG_OFF>>ENV_BITS]= EG_ENT-1;
- /* make LFO ams table */
- for (i=0; i<AMS_ENT; i++)
- {
- pom = (1.0+sin(2*PI*i/AMS_ENT))/2; /* sin */
- AMS_TABLE[i] = (1.0/EG_STEP)*pom; /* 1dB */
- AMS_TABLE[AMS_ENT+i] = (4.8/EG_STEP)*pom; /* 4.8dB */
- }
- /* make LFO vibrate table */
- for (i=0; i<VIB_ENT; i++)
- {
- /* 100cent = 1seminote = 6% ?? */
- pom = (double)VIB_RATE*0.06*sin(2*PI*i/VIB_ENT); /* +-100sect step */
- VIB_TABLE[i] = VIB_RATE + (pom*0.07); /* +- 7cent */
- VIB_TABLE[VIB_ENT+i] = VIB_RATE + (pom*0.14); /* +-14cent */
- /* LOG(LOG_INF,("vib %d=%d\n",i,VIB_TABLE[VIB_ENT+i])); */
- }
- return 1;
-}
-
-
-static void OPLCloseTable( void )
-{
- free(TL_TABLE);
- free(SIN_TABLE);
- free(AMS_TABLE);
- free(VIB_TABLE);
-}
-
-/* CSM Key Controll */
-INLINE void CSMKeyControll(OPL_CH *CH)
-{
- OPL_SLOT *slot1 = &CH->SLOT[SLOT1];
- OPL_SLOT *slot2 = &CH->SLOT[SLOT2];
- /* all key off */
- OPL_KEYOFF(slot1);
- OPL_KEYOFF(slot2);
- /* total level latch */
- slot1->TLL = slot1->TL + (CH->ksl_base>>slot1->ksl);
- slot1->TLL = slot1->TL + (CH->ksl_base>>slot1->ksl);
- /* key on */
- CH->op1_out[0] = CH->op1_out[1] = 0;
- OPL_KEYON(slot1);
- OPL_KEYON(slot2);
-}
-
-/* ---------- opl initialize ---------- */
-static void OPL_initalize(FM_OPL *OPL)
-{
- int fn;
-
- /* frequency base */
- OPL->freqbase = (OPL->rate) ? ((double)OPL->clock / OPL->rate) / 72 : 0;
- /* Timer base time */
- OPL->TimerBase = 1.0/((double)OPL->clock / 72.0 );
- /* make time tables */
- init_timetables( OPL , OPL_ARRATE , OPL_DRRATE );
- /* make fnumber -> increment counter table */
- for( fn=0 ; fn < 1024 ; fn++ )
- {
- OPL->FN_TABLE[fn] = OPL->freqbase * fn * FREQ_RATE * (1<<7) / 2;
- }
- /* LFO freq.table */
- OPL->amsIncr = OPL->rate ? (double)AMS_ENT*(1<<AMS_SHIFT) / OPL->rate * 3.7 * ((double)OPL->clock/3600000) : 0;
- OPL->vibIncr = OPL->rate ? (double)VIB_ENT*(1<<VIB_SHIFT) / OPL->rate * 6.4 * ((double)OPL->clock/3600000) : 0;
-}
-
-/* ---------- write a OPL registers ---------- */
-static void OPLWriteReg(FM_OPL *OPL, int r, int v)
-{
- OPL_CH *CH;
- int slot;
- int block_fnum;
-
- switch(r&0xe0)
- {
- case 0x00: /* 00-1f:controll */
- switch(r&0x1f)
- {
- case 0x01:
- /* wave selector enable */
- if(OPL->type&OPL_TYPE_WAVESEL)
- {
- OPL->wavesel = v&0x20;
- if(!OPL->wavesel)
- {
- /* preset compatible mode */
- int c;
- for(c=0;c<OPL->max_ch;c++)
- {
- OPL->P_CH[c].SLOT[SLOT1].wavetable = &SIN_TABLE[0];
- OPL->P_CH[c].SLOT[SLOT2].wavetable = &SIN_TABLE[0];
- }
- }
- }
- return;
- case 0x02: /* Timer 1 */
- OPL->T[0] = (256-v)*4;
- break;
- case 0x03: /* Timer 2 */
- OPL->T[1] = (256-v)*16;
- return;
- case 0x04: /* IRQ clear / mask and Timer enable */
- if(v&0x80)
- { /* IRQ flag clear */
- OPL_STATUS_RESET(OPL,0x7f);
- }
- else
- { /* set IRQ mask ,timer enable*/
- UINT8 st1 = v&1;
- UINT8 st2 = (v>>1)&1;
- /* IRQRST,T1MSK,t2MSK,EOSMSK,BRMSK,x,ST2,ST1 */
- OPL_STATUS_RESET(OPL,v&0x78);
- OPL_STATUSMASK_SET(OPL,((~v)&0x78)|0x01);
- /* timer 2 */
- if(OPL->st[1] != st2)
- {
- double interval = st2 ? (double)OPL->T[1]*OPL->TimerBase : 0.0;
- OPL->st[1] = st2;
- if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+1,interval);
- }
- /* timer 1 */
- if(OPL->st[0] != st1)
- {
- double interval = st1 ? (double)OPL->T[0]*OPL->TimerBase : 0.0;
- OPL->st[0] = st1;
- if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+0,interval);
- }
- }
- return;
-#if BUILD_Y8950
- case 0x06: /* Key Board OUT */
- if(OPL->type&OPL_TYPE_KEYBOARD)
- {
- if(OPL->keyboardhandler_w)
- OPL->keyboardhandler_w(OPL->keyboard_param,v);
- else
- LOG(LOG_WAR,("OPL:write unmapped KEYBOARD port\n"));
- }
- return;
- case 0x07: /* DELTA-T controll : START,REC,MEMDATA,REPT,SPOFF,x,x,RST */
- if(OPL->type&OPL_TYPE_ADPCM)
- YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
- return;
- case 0x08: /* MODE,DELTA-T : CSM,NOTESEL,x,x,smpl,da/ad,64k,rom */
- OPL->mode = v;
- v&=0x1f; /* for DELTA-T unit */
- case 0x09: /* START ADD */
- case 0x0a:
- case 0x0b: /* STOP ADD */
- case 0x0c:
- case 0x0d: /* PRESCALE */
- case 0x0e:
- case 0x0f: /* ADPCM data */
- case 0x10: /* DELTA-N */
- case 0x11: /* DELTA-N */
- case 0x12: /* EG-CTRL */
- if(OPL->type&OPL_TYPE_ADPCM)
- YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
- return;
-#if 0
- case 0x15: /* DAC data */
- case 0x16:
- case 0x17: /* SHIFT */
- return;
- case 0x18: /* I/O CTRL (Direction) */
- if(OPL->type&OPL_TYPE_IO)
- OPL->portDirection = v&0x0f;
- return;
- case 0x19: /* I/O DATA */
- if(OPL->type&OPL_TYPE_IO)
- {
- OPL->portLatch = v;
- if(OPL->porthandler_w)
- OPL->porthandler_w(OPL->port_param,v&OPL->portDirection);
- }
- return;
- case 0x1a: /* PCM data */
- return;
-#endif
-#endif
- }
- break;
- case 0x20: /* am,vib,ksr,eg type,mul */
- slot = slot_array[r&0x1f];
- if(slot == -1) return;
- set_mul(OPL,slot,v);
- return;
- case 0x40:
- slot = slot_array[r&0x1f];
- if(slot == -1) return;
- set_ksl_tl(OPL,slot,v);
- return;
- case 0x60:
- slot = slot_array[r&0x1f];
- if(slot == -1) return;
- set_ar_dr(OPL,slot,v);
- return;
- case 0x80:
- slot = slot_array[r&0x1f];
- if(slot == -1) return;
- set_sl_rr(OPL,slot,v);
- return;
- case 0xa0:
- switch(r)
- {
- case 0xbd:
- /* amsep,vibdep,r,bd,sd,tom,tc,hh */
- {
- UINT8 rkey = OPL->rythm^v;
- OPL->ams_table = &AMS_TABLE[v&0x80 ? AMS_ENT : 0];
- OPL->vib_table = &VIB_TABLE[v&0x40 ? VIB_ENT : 0];
- OPL->rythm = v&0x3f;
- if(OPL->rythm&0x20)
- {
-#if 0
- usrintf_showmessage("OPL Rythm mode select");
-#endif
- /* BD key on/off */
- if(rkey&0x10)
- {
- if(v&0x10)
- {
- OPL->P_CH[6].op1_out[0] = OPL->P_CH[6].op1_out[1] = 0;
- OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT1]);
- OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT2]);
- }
- else
- {
- OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1]);
- OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2]);
- }
- }
- /* SD key on/off */
- if(rkey&0x08)
- {
- if(v&0x08) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT2]);
- else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2]);
- }/* TAM key on/off */
- if(rkey&0x04)
- {
- if(v&0x04) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT1]);
- else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1]);
- }
- /* TOP-CY key on/off */
- if(rkey&0x02)
- {
- if(v&0x02) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT2]);
- else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2]);
- }
- /* HH key on/off */
- if(rkey&0x01)
- {
- if(v&0x01) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT1]);
- else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1]);
- }
- }
- }
- return;
- }
- /* keyon,block,fnum */
- if( (r&0x0f) > 8) return;
- CH = &OPL->P_CH[r&0x0f];
- if(!(r&0x10))
- { /* a0-a8 */
- block_fnum = (CH->block_fnum&0x1f00) | v;
- }
- else
- { /* b0-b8 */
- int keyon = (v>>5)&1;
- block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff);
- if(CH->keyon != keyon)
- {
- if( (CH->keyon=keyon) )
- {
- CH->op1_out[0] = CH->op1_out[1] = 0;
- OPL_KEYON(&CH->SLOT[SLOT1]);
- OPL_KEYON(&CH->SLOT[SLOT2]);
- }
- else
- {
- OPL_KEYOFF(&CH->SLOT[SLOT1]);
- OPL_KEYOFF(&CH->SLOT[SLOT2]);
- }
- }
- }
- /* update */
- if(CH->block_fnum != block_fnum)
- {
- int blockRv = 7-(block_fnum>>10);
- int fnum = block_fnum&0x3ff;
- CH->block_fnum = block_fnum;
-
- CH->ksl_base = KSL_TABLE[block_fnum>>6];
- CH->fc = OPL->FN_TABLE[fnum]>>blockRv;
- CH->kcode = CH->block_fnum>>9;
- if( (OPL->mode&0x40) && CH->block_fnum&0x100) CH->kcode |=1;
- CALC_FCSLOT(CH,&CH->SLOT[SLOT1]);
- CALC_FCSLOT(CH,&CH->SLOT[SLOT2]);
- }
- return;
- case 0xc0:
- /* FB,C */
- if( (r&0x0f) > 8) return;
- CH = &OPL->P_CH[r&0x0f];
- {
- int feedback = (v>>1)&7;
- CH->FB = feedback ? (8+1) - feedback : 0;
- CH->CON = v&1;
- set_algorythm(CH);
- }
- return;
- case 0xe0: /* wave type */
- slot = slot_array[r&0x1f];
- if(slot == -1) return;
- CH = &OPL->P_CH[slot/2];
- if(OPL->wavesel)
- {
- /* LOG(LOG_INF,("OPL SLOT %d wave select %d\n",slot,v&3)); */
- CH->SLOT[slot&1].wavetable = &SIN_TABLE[(v&0x03)*SIN_ENT];
- }
- return;
- }
-}
-
-/* lock/unlock for common table */
-static int OPL_LockTable()
-{
- num_lock++;
- if(num_lock>1) return 0;
- /* first time */
- cur_chip = NULL;
- /* allocate total level table (128kb space) */
- if( !OPLOpenTable() )
- {
- num_lock--;
- return -1;
- }
- return 0;
-}
-
-static void OPL_UnLockTable()
-{
- if(num_lock) num_lock--;
- if(num_lock) return;
- /* last time */
- cur_chip = NULL;
- OPLCloseTable();
-}
-
-#if (BUILD_YM3812 || BUILD_YM3526)
-/*******************************************************************************/
-/* YM3812 local section */
-/*******************************************************************************/
-
-/* ---------- update one of chip ----------- */
-void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length)
-{
- int i;
- int data;
- OPLSAMPLE *buf = buffer;
- UINT32 amsCnt = OPL->amsCnt;
- UINT32 vibCnt = OPL->vibCnt;
- UINT8 rythm = OPL->rythm&0x20;
- OPL_CH *CH,*R_CH;
-
- if( (void *)OPL != cur_chip ){
- cur_chip = (void *)OPL;
- /* channel pointers */
- S_CH = OPL->P_CH;
- E_CH = &S_CH[9];
- /* rythm slot */
- SLOT7_1 = &S_CH[7].SLOT[SLOT1];
- SLOT7_2 = &S_CH[7].SLOT[SLOT2];
- SLOT8_1 = &S_CH[8].SLOT[SLOT1];
- SLOT8_2 = &S_CH[8].SLOT[SLOT2];
- /* LFO state */
- amsIncr = OPL->amsIncr;
- vibIncr = OPL->vibIncr;
- ams_table = OPL->ams_table;
- vib_table = OPL->vib_table;
- }
- R_CH = rythm ? &S_CH[6] : E_CH;
- for( i=0; i < length ; i++ )
- {
- /* channel A channel B channel C */
- /* LFO */
- ams = ams_table[(amsCnt+=amsIncr)>>AMS_SHIFT];
- vib = vib_table[(vibCnt+=vibIncr)>>VIB_SHIFT];
- outd[0] = 0;
- /* FM part */
- for(CH=S_CH ; CH < R_CH ; CH++)
- OPL_CALC_CH(CH);
- /* Rythn part */
- if(rythm)
- OPL_CALC_RH(S_CH);
- /* limit check */
- data = Limit( outd[0] , OPL_MAXOUT, OPL_MINOUT );
- /* store to sound buffer */
- buf[i] = data >> OPL_OUTSB;
- }
-
- OPL->amsCnt = amsCnt;
- OPL->vibCnt = vibCnt;
-#ifdef OPL_OUTPUT_LOG
- if(opl_dbg_fp)
- {
- for(opl_dbg_chip=0;opl_dbg_chip<opl_dbg_maxchip;opl_dbg_chip++)
- if( opl_dbg_opl[opl_dbg_chip] == OPL) break;
- fprintf(opl_dbg_fp,"%c%c%c",0x20+opl_dbg_chip,length&0xff,length/256);
- }
-#endif
-}
-#endif /* (BUILD_YM3812 || BUILD_YM3526) */
-
-#if BUILD_Y8950
-
-void Y8950UpdateOne(FM_OPL *OPL, INT16 *buffer, int length)
-{
- int i;
- int data;
- OPLSAMPLE *buf = buffer;
- UINT32 amsCnt = OPL->amsCnt;
- UINT32 vibCnt = OPL->vibCnt;
- UINT8 rythm = OPL->rythm&0x20;
- OPL_CH *CH,*R_CH;
- YM_DELTAT *DELTAT = OPL->deltat;
-
- /* setup DELTA-T unit */
- YM_DELTAT_DECODE_PRESET(DELTAT);
-
- if( (void *)OPL != cur_chip ){
- cur_chip = (void *)OPL;
- /* channel pointers */
- S_CH = OPL->P_CH;
- E_CH = &S_CH[9];
- /* rythm slot */
- SLOT7_1 = &S_CH[7].SLOT[SLOT1];
- SLOT7_2 = &S_CH[7].SLOT[SLOT2];
- SLOT8_1 = &S_CH[8].SLOT[SLOT1];
- SLOT8_2 = &S_CH[8].SLOT[SLOT2];
- /* LFO state */
- amsIncr = OPL->amsIncr;
- vibIncr = OPL->vibIncr;
- ams_table = OPL->ams_table;
- vib_table = OPL->vib_table;
- }
- R_CH = rythm ? &S_CH[6] : E_CH;
- for( i=0; i < length ; i++ )
- {
- /* channel A channel B channel C */
- /* LFO */
- ams = ams_table[(amsCnt+=amsIncr)>>AMS_SHIFT];
- vib = vib_table[(vibCnt+=vibIncr)>>VIB_SHIFT];
- outd[0] = 0;
- /* deltaT ADPCM */
- if( DELTAT->portstate )
- YM_DELTAT_ADPCM_CALC(DELTAT);
- /* FM part */
- for(CH=S_CH ; CH < R_CH ; CH++)
- OPL_CALC_CH(CH);
- /* Rythn part */
- if(rythm)
- OPL_CALC_RH(S_CH);
- /* limit check */
- data = Limit( outd[0] , OPL_MAXOUT, OPL_MINOUT );
- /* store to sound buffer */
- buf[i] = data >> OPL_OUTSB;
- }
- OPL->amsCnt = amsCnt;
- OPL->vibCnt = vibCnt;
- /* deltaT START flag */
- if( !DELTAT->portstate )
- OPL->status &= 0xfe;
-}
-#endif
-
-/* ---------- reset one of chip ---------- */
-void OPLResetChip(FM_OPL *OPL)
-{
- int c,s;
- int i;
-
- /* reset chip */
- OPL->mode = 0; /* normal mode */
- OPL_STATUS_RESET(OPL,0x7f);
- /* reset with register write */
- OPLWriteReg(OPL,0x01,0); /* wabesel disable */
- OPLWriteReg(OPL,0x02,0); /* Timer1 */
- OPLWriteReg(OPL,0x03,0); /* Timer2 */
- OPLWriteReg(OPL,0x04,0); /* IRQ mask clear */
- for(i = 0xff ; i >= 0x20 ; i-- ) OPLWriteReg(OPL,i,0);
- /* reset OPerator paramater */
- for( c = 0 ; c < OPL->max_ch ; c++ )
- {
- OPL_CH *CH = &OPL->P_CH[c];
- /* OPL->P_CH[c].PAN = OPN_CENTER; */
- for(s = 0 ; s < 2 ; s++ )
- {
- /* wave table */
- CH->SLOT[s].wavetable = &SIN_TABLE[0];
- /* CH->SLOT[s].evm = ENV_MOD_RR; */
- CH->SLOT[s].evc = EG_OFF;
- CH->SLOT[s].eve = EG_OFF+1;
- CH->SLOT[s].evs = 0;
- }
- }
-#if BUILD_Y8950
- if(OPL->type&OPL_TYPE_ADPCM)
- {
- YM_DELTAT *DELTAT = OPL->deltat;
-
- DELTAT->freqbase = OPL->freqbase;
- DELTAT->output_pointer = outd;
- DELTAT->portshift = 5;
- DELTAT->output_range = DELTAT_MIXING_LEVEL<<TL_BITS;
- YM_DELTAT_ADPCM_Reset(DELTAT,0);
- }
-#endif
-}
-
-/* ---------- Create one of vietual YM3812 ---------- */
-/* 'rate' is sampling rate and 'bufsiz' is the size of the */
-FM_OPL *OPLCreate(int type, int clock, int rate)
-{
- char *ptr;
- FM_OPL *OPL;
- int state_size;
- int max_ch = 9; /* normaly 9 channels */
-
- if( OPL_LockTable() ==-1) return NULL;
- /* allocate OPL state space */
- state_size = sizeof(FM_OPL);
- state_size += sizeof(OPL_CH)*max_ch;
-#if BUILD_Y8950
- if(type&OPL_TYPE_ADPCM) state_size+= sizeof(YM_DELTAT);
-#endif
- /* allocate memory block */
- ptr = (char*)malloc(state_size);
- if(ptr==NULL) return NULL;
- /* clear */
- memset(ptr,0,state_size);
- OPL = (FM_OPL *)ptr; ptr+=sizeof(FM_OPL);
- OPL->P_CH = (OPL_CH *)ptr; ptr+=sizeof(OPL_CH)*max_ch;
-#if BUILD_Y8950
- if(type&OPL_TYPE_ADPCM) OPL->deltat = (YM_DELTAT *)ptr; ptr+=sizeof(YM_DELTAT);
-#endif
- /* set channel state pointer */
- OPL->type = type;
- OPL->clock = clock;
- OPL->rate = rate;
- OPL->max_ch = max_ch;
- /* init grobal tables */
- OPL_initalize(OPL);
- /* reset chip */
- OPLResetChip(OPL);
-#ifdef OPL_OUTPUT_LOG
- if(!opl_dbg_fp)
- {
- opl_dbg_fp = fopen("opllog.opl","wb");
- opl_dbg_maxchip = 0;
- }
- if(opl_dbg_fp)
- {
- opl_dbg_opl[opl_dbg_maxchip] = OPL;
- fprintf(opl_dbg_fp,"%c%c%c%c%c%c",0x00+opl_dbg_maxchip,
- type,
- clock&0xff,
- (clock/0x100)&0xff,
- (clock/0x10000)&0xff,
- (clock/0x1000000)&0xff);
- opl_dbg_maxchip++;
- }
-#endif
- return OPL;
-}
-
-/* ---------- Destroy one of vietual YM3812 ---------- */
-void OPLDestroy(FM_OPL *OPL)
-{
-#ifdef OPL_OUTPUT_LOG
- if(opl_dbg_fp)
- {
- fclose(opl_dbg_fp);
- opl_dbg_fp = NULL;
- }
-#endif
- OPL_UnLockTable();
- free(OPL);
-}
-
-/* ---------- Option handlers ---------- */
-
-void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset)
-{
- OPL->TimerHandler = TimerHandler;
- OPL->TimerParam = channelOffset;
-}
-void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param)
-{
- OPL->IRQHandler = IRQHandler;
- OPL->IRQParam = param;
-}
-void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param)
-{
- OPL->UpdateHandler = UpdateHandler;
- OPL->UpdateParam = param;
-}
-#if BUILD_Y8950
-void OPLSetPortHandler(FM_OPL *OPL,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,int param)
-{
- OPL->porthandler_w = PortHandler_w;
- OPL->porthandler_r = PortHandler_r;
- OPL->port_param = param;
-}
-
-void OPLSetKeyboardHandler(FM_OPL *OPL,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,int param)
-{
- OPL->keyboardhandler_w = KeyboardHandler_w;
- OPL->keyboardhandler_r = KeyboardHandler_r;
- OPL->keyboard_param = param;
-}
-#endif
-/* ---------- YM3812 I/O interface ---------- */
-int OPLWrite(FM_OPL *OPL,int a,int v)
-{
- if( !(a&1) )
- { /* address port */
- OPL->address = v & 0xff;
- }
- else
- { /* data port */
- if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
-#ifdef OPL_OUTPUT_LOG
- if(opl_dbg_fp)
- {
- for(opl_dbg_chip=0;opl_dbg_chip<opl_dbg_maxchip;opl_dbg_chip++)
- if( opl_dbg_opl[opl_dbg_chip] == OPL) break;
- fprintf(opl_dbg_fp,"%c%c%c",0x10+opl_dbg_chip,OPL->address,v);
- }
-#endif
- OPLWriteReg(OPL,OPL->address,v);
- }
- return OPL->status>>7;
-}
-
-unsigned char OPLRead(FM_OPL *OPL,int a)
-{
- if( !(a&1) )
- { /* status port */
- return OPL->status & (OPL->statusmask|0x80);
- }
- /* data port */
- switch(OPL->address)
- {
- case 0x05: /* KeyBoard IN */
- if(OPL->type&OPL_TYPE_KEYBOARD)
- {
- if(OPL->keyboardhandler_r)
- return OPL->keyboardhandler_r(OPL->keyboard_param);
- else
- LOG(LOG_WAR,("OPL:read unmapped KEYBOARD port\n"));
- }
- return 0;
-#if 0
- case 0x0f: /* ADPCM-DATA */
- return 0;
-#endif
- case 0x19: /* I/O DATA */
- if(OPL->type&OPL_TYPE_IO)
- {
- if(OPL->porthandler_r)
- return OPL->porthandler_r(OPL->port_param);
- else
- LOG(LOG_WAR,("OPL:read unmapped I/O port\n"));
- }
- return 0;
- case 0x1a: /* PCM-DATA */
- return 0;
- }
- return 0;
-}
-
-int OPLTimerOver(FM_OPL *OPL,int c)
-{
- if( c )
- { /* Timer B */
- OPL_STATUS_SET(OPL,0x20);
- }
- else
- { /* Timer A */
- OPL_STATUS_SET(OPL,0x40);
- /* CSM mode key,TL controll */
- if( OPL->mode & 0x80 )
- { /* CSM mode total level latch and auto key on */
- int ch;
- if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
- for(ch=0;ch<9;ch++)
- CSMKeyControll( &OPL->P_CH[ch] );
- }
- }
- /* reload timer */
- if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+c,(double)OPL->T[c]*OPL->TimerBase);
- return OPL->status>>7;
-}
diff --git a/src/adplug/core/fmopl.h b/src/adplug/core/fmopl.h
deleted file mode 100644
index cfa0e02..0000000
--- a/src/adplug/core/fmopl.h
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef __FMOPL_H_
-#define __FMOPL_H_
-
-/* --- select emulation chips --- */
-#define BUILD_YM3812 (HAS_YM3812)
-//#define BUILD_YM3526 (HAS_YM3526)
-//#define BUILD_Y8950 (HAS_Y8950)
-
-/* --- system optimize --- */
-/* select bit size of output : 8 or 16 */
-#define OPL_OUTPUT_BIT 16
-
-/* compiler dependence */
-#ifndef OSD_CPU_H
-#define OSD_CPU_H
-typedef unsigned char UINT8; /* unsigned 8bit */
-typedef unsigned short UINT16; /* unsigned 16bit */
-typedef unsigned int UINT32; /* unsigned 32bit */
-typedef signed char INT8; /* signed 8bit */
-typedef signed short INT16; /* signed 16bit */
-typedef signed int INT32; /* signed 32bit */
-#endif
-
-#if (OPL_OUTPUT_BIT==16)
-typedef INT16 OPLSAMPLE;
-#endif
-#if (OPL_OUTPUT_BIT==8)
-typedef unsigned char OPLSAMPLE;
-#endif
-
-
-#if BUILD_Y8950
-#include "ymdeltat.h"
-#endif
-
-typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
-typedef void (*OPL_IRQHANDLER)(int param,int irq);
-typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
-typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
-typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
-
-/* !!!!! here is private section , do not access there member direct !!!!! */
-
-#define OPL_TYPE_WAVESEL 0x01 /* waveform select */
-#define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
-#define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
-#define OPL_TYPE_IO 0x08 /* I/O port */
-
-/* Saving is necessary for member of the 'R' mark for suspend/resume */
-/* ---------- OPL one of slot ---------- */
-typedef struct fm_opl_slot {
- INT32 TL; /* total level :TL << 8 */
- INT32 TLL; /* adjusted now TL */
- UINT8 KSR; /* key scale rate :(shift down bit) */
- INT32 *AR; /* attack rate :&AR_TABLE[AR<<2] */
- INT32 *DR; /* decay rate :&DR_TALBE[DR<<2] */
- INT32 SL; /* sustin level :SL_TALBE[SL] */
- INT32 *RR; /* release rate :&DR_TABLE[RR<<2] */
- UINT8 ksl; /* keyscale level :(shift down bits) */
- UINT8 ksr; /* key scale rate :kcode>>KSR */
- UINT32 mul; /* multiple :ML_TABLE[ML] */
- UINT32 Cnt; /* frequency count : */
- UINT32 Incr; /* frequency step : */
- /* envelope generator state */
- UINT8 eg_typ; /* envelope type flag */
- UINT8 evm; /* envelope phase */
- INT32 evc; /* envelope counter */
- INT32 eve; /* envelope counter end point */
- INT32 evs; /* envelope counter step */
- INT32 evsa; /* envelope step for AR :AR[ksr] */
- INT32 evsd; /* envelope step for DR :DR[ksr] */
- INT32 evsr; /* envelope step for RR :RR[ksr] */
- /* LFO */
- UINT8 ams; /* ams flag */
- UINT8 vib; /* vibrate flag */
- /* wave selector */
- INT32 **wavetable;
-}OPL_SLOT;
-
-/* ---------- OPL one of channel ---------- */
-typedef struct fm_opl_channel {
- OPL_SLOT SLOT[2];
- UINT8 CON; /* connection type */
- UINT8 FB; /* feed back :(shift down bit) */
- INT32 *connect1; /* slot1 output pointer */
- INT32 *connect2; /* slot2 output pointer */
- INT32 op1_out[2]; /* slot1 output for selfeedback */
- /* phase generator state */
- UINT32 block_fnum; /* block+fnum : */
- UINT8 kcode; /* key code : KeyScaleCode */
- UINT32 fc; /* Freq. Increment base */
- UINT32 ksl_base; /* KeyScaleLevel Base step */
- UINT8 keyon; /* key on/off flag */
-} OPL_CH;
-
-/* OPL state */
-typedef struct fm_opl_f {
- UINT8 type; /* chip type */
- int clock; /* master clock (Hz) */
- int rate; /* sampling rate (Hz) */
- double freqbase; /* frequency base */
- double TimerBase; /* Timer base time (==sampling time) */
- UINT8 address; /* address register */
- UINT8 status; /* status flag */
- UINT8 statusmask; /* status mask */
- UINT32 mode; /* Reg.08 : CSM , notesel,etc. */
- /* Timer */
- int T[2]; /* timer counter */
- UINT8 st[2]; /* timer enable */
- /* FM channel slots */
- OPL_CH *P_CH; /* pointer of CH */
- int max_ch; /* maximum channel */
- /* Rythm sention */
- UINT8 rythm; /* Rythm mode , key flag */
-#if BUILD_Y8950
- /* Delta-T ADPCM unit (Y8950) */
- YM_DELTAT *deltat; /* DELTA-T ADPCM */
-#endif
- /* Keyboard / I/O interface unit (Y8950) */
- UINT8 portDirection;
- UINT8 portLatch;
- OPL_PORTHANDLER_R porthandler_r;
- OPL_PORTHANDLER_W porthandler_w;
- int port_param;
- OPL_PORTHANDLER_R keyboardhandler_r;
- OPL_PORTHANDLER_W keyboardhandler_w;
- int keyboard_param;
- /* time tables */
- INT32 AR_TABLE[75]; /* atttack rate tables */
- INT32 DR_TABLE[75]; /* decay rate tables */
- UINT32 FN_TABLE[1024]; /* fnumber -> increment counter */
- /* LFO */
- INT32 *ams_table;
- INT32 *vib_table;
- INT32 amsCnt;
- INT32 amsIncr;
- INT32 vibCnt;
- INT32 vibIncr;
- /* wave selector enable flag */
- UINT8 wavesel;
- /* external event callback handler */
- OPL_TIMERHANDLER TimerHandler; /* TIMER handler */
- int TimerParam; /* TIMER parameter */
- OPL_IRQHANDLER IRQHandler; /* IRQ handler */
- int IRQParam; /* IRQ parameter */
- OPL_UPDATEHANDLER UpdateHandler; /* stream update handler */
- int UpdateParam; /* stream update parameter */
-} FM_OPL;
-
-/* ---------- Generic interface section ---------- */
-#define OPL_TYPE_YM3526 (0)
-#define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
-#define OPL_TYPE_Y8950 (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
-
-FM_OPL *OPLCreate(int type, int clock, int rate);
-void OPLDestroy(FM_OPL *OPL);
-void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);
-void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param);
-void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param);
-/* Y8950 port handlers */
-void OPLSetPortHandler(FM_OPL *OPL,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,int param);
-void OPLSetKeyboardHandler(FM_OPL *OPL,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,int param);
-
-void OPLResetChip(FM_OPL *OPL);
-int OPLWrite(FM_OPL *OPL,int a,int v);
-unsigned char OPLRead(FM_OPL *OPL,int a);
-int OPLTimerOver(FM_OPL *OPL,int c);
-
-/* YM3626/YM3812 local section */
-void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
-
-void Y8950UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
-
-#endif
diff --git a/src/adplug/core/fprovide.cc b/src/adplug/core/fprovide.cc
deleted file mode 100644
index 034b407..0000000
--- a/src/adplug/core/fprovide.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2002 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * fprovide.cpp - File provider class framework, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-#include "binio.h"
-#include "binfile.h"
-
-#include "fprovide.h"
-#include "binio_virtual.h"
-
-/***** CFileProvider *****/
-
-bool CFileProvider::extension(const std::string &filename,
- const std::string &extension)
-{
- const char *fname = filename.c_str(), *ext = extension.c_str();
-
- if(strlen(fname) < strlen(ext) ||
- strcasecmp(fname + strlen(fname) - strlen(ext), ext))
- return false;
- else
- return true;
-}
-
-unsigned long CFileProvider::filesize(binistream *f)
-{
- return static_cast<vfsistream*>(f)->size();
-}
-
-binistream *CFileProvider::open(std::string filename) const
-{
- binistream *f;
-
- if (!strcmp(filename.c_str(), m_file.filename()) && !m_file.fseek(0, VFS_SEEK_SET))
- f = new vfsistream(&m_file);
- else
- f = new vfsistream(filename);
-
- if(f->error()) { delete f; return 0; }
-
- // Open all files as little endian with IEEE floats by default
- f->setFlag(binio::BigEndian, false); f->setFlag(binio::FloatIEEE);
-
- return f;
-}
diff --git a/src/adplug/core/fprovide.h b/src/adplug/core/fprovide.h
deleted file mode 100644
index adf8d35..0000000
--- a/src/adplug/core/fprovide.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * fprovide.h - File provider class framework, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_FILEPROVIDER
-#define H_ADPLUG_FILEPROVIDER
-
-#include <string>
-#include "binio.h"
-
-class VFSFile;
-
-class CFileProvider
-{
-public:
- CFileProvider(VFSFile &file) :
- m_file(file) {}
-
- binistream *open(std::string filename) const;
-
- static void close(binistream *f)
- { delete f; }
-
- static bool extension(const std::string &filename,
- const std::string &extension);
- static unsigned long filesize(binistream *f);
-
-private:
- VFSFile &m_file;
-};
-
-#endif
diff --git a/src/adplug/core/hsc.cc b/src/adplug/core/hsc.cc
deleted file mode 100644
index 8430111..0000000
--- a/src/adplug/core/hsc.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * hsc.cpp - HSC Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "hsc.h"
-#include "debug.h"
-
-/*** public methods **************************************/
-
-CPlayer *ChscPlayer::factory(Copl *newopl)
-{
- return new ChscPlayer(newopl);
-}
-
-bool ChscPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename);
- int i;
-
- // file validation section
- if(!f || !fp.extension(filename, ".hsc") || fp.filesize(f) > 59187) {
- AdPlug_LogWrite("ChscPlayer::load(\"%s\"): Not a HSC file!\n", filename.c_str());
- fp.close(f);
- return false;
- }
-
- // load section
- for(i=0;i<128*12;i++) // load instruments
- *((unsigned char *)instr + i) = f->readInt(1);
- for (i=0;i<128;i++) { // correct instruments
- instr[i][2] ^= (instr[i][2] & 0x40) << 1;
- instr[i][3] ^= (instr[i][3] & 0x40) << 1;
- instr[i][11] >>= 4; // slide
- }
- for(i=0;i<51;i++) song[i] = f->readInt(1); // load tracklist
- for(i=0;i<50*64*9;i++) // load patterns
- *((char *)patterns + i) = f->readInt(1);
-
- fp.close(f);
- rewind(0); // rewind module
- return true;
-}
-
-bool ChscPlayer::update()
-{
- // general vars
- unsigned char chan,pattnr,note,effect,eff_op,inst,vol,Okt,db;
- unsigned short Fnr;
- unsigned long pattoff;
-
- del--; // player speed handling
- if(del)
- return !songend; // nothing done
-
- if(fadein) // fade-in handling
- fadein--;
-
- pattnr = song[songpos];
- if(pattnr == 0xff) { // arrangement handling
- songend = 1; // set end-flag
- songpos = 0;
- pattnr = song[songpos];
- } else
- if ((pattnr & 128) && (pattnr <= 0xb1)) { // goto pattern "nr"
- songpos = song[songpos] & 127;
- pattpos = 0;
- pattnr = song[songpos];
- songend = 1;
- }
-
- pattoff = pattpos*9;
- for (chan=0;chan<9;chan++) { // handle all channels
- note = patterns[pattnr][pattoff].note;
- effect = patterns[pattnr][pattoff].effect;
- pattoff++;
-
- if(note & 128) { // set instrument
- setinstr(chan,effect);
- continue;
- }
- eff_op = effect & 0x0f;
- inst = channel[chan].inst;
- if(note)
- channel[chan].slide = 0;
-
- switch (effect & 0xf0) { // effect handling
- case 0: // global effect
- /* The following fx are unimplemented on purpose:
- * 02 - Slide Mainvolume up
- * 03 - Slide Mainvolume down (here: fade in)
- * 04 - Set Mainvolume to 0
- *
- * This is because i've never seen any HSC modules using the fx this way.
- * All modules use the fx the way, i've implemented it.
- */
- switch(eff_op) {
- case 1: pattbreak++; break; // jump to next pattern
- case 3: fadein = 31; break; // fade in (divided by 2)
- case 5: mode6 = 1; break; // 6 voice mode on
- case 6: mode6 = 0; break; // 6 voice mode off
- }
- break;
- case 0x20:
- case 0x10: // manual slides
- if (effect & 0x10) {
- channel[chan].freq += eff_op;
- channel[chan].slide += eff_op;
- } else {
- channel[chan].freq -= eff_op;
- channel[chan].slide -= eff_op;
- }
- if(!note)
- setfreq(chan,channel[chan].freq);
- break;
- case 0x50: // set percussion instrument (unimplemented)
- break;
- case 0x60: // set feedback
- opl->write(0xc0 + chan, (instr[channel[chan].inst][8] & 1) + (eff_op << 1));
- break;
- case 0xa0: // set carrier volume
- vol = eff_op << 2;
- opl->write(0x43 + op_table[chan], vol | (instr[channel[chan].inst][2] & ~63));
- break;
- case 0xb0: // set modulator volume
- vol = eff_op << 2;
- if (instr[inst][8] & 1)
- opl->write(0x40 + op_table[chan], vol | (instr[channel[chan].inst][3] & ~63));
- else
- opl->write(0x40 + op_table[chan],vol | (instr[inst][3] & ~63));
- break;
- case 0xc0: // set instrument volume
- db = eff_op << 2;
- opl->write(0x43 + op_table[chan], db | (instr[channel[chan].inst][2] & ~63));
- if (instr[inst][8] & 1)
- opl->write(0x40 + op_table[chan], db | (instr[channel[chan].inst][3] & ~63));
- break;
- case 0xd0: pattbreak++; songpos = eff_op; songend = 1; break; // position jump
- case 0xf0: // set speed
- speed = eff_op;
- del = ++speed;
- break;
- }
-
- if(fadein) // fade-in volume setting
- setvolume(chan,fadein*2,fadein*2);
-
- if(!note) // note handling
- continue;
- note--;
-
- if ((note == 0x7f-1) || ((note/12) & ~7)) { // pause (7fh)
- adl_freq[chan] &= ~32;
- opl->write(0xb0 + chan,adl_freq[chan]);
- continue;
- }
-
- // play the note
- if(mtkmode) // imitate MPU-401 Trakker bug
- note--;
- Okt = ((note/12) & 7) << 2;
- Fnr = note_table[(note % 12)] + instr[inst][11] + channel[chan].slide;
- channel[chan].freq = Fnr;
- if(!mode6 || chan < 6)
- adl_freq[chan] = Okt | 32;
- else
- adl_freq[chan] = Okt; // never set key for drums
- opl->write(0xb0 + chan, 0);
- setfreq(chan,Fnr);
- if(mode6) {
- switch(chan) { // play drums
- case 6: opl->write(0xbd,bd & ~16); bd |= 48; break; // bass drum
- case 7: opl->write(0xbd,bd & ~1); bd |= 33; break; // hihat
- case 8: opl->write(0xbd,bd & ~2); bd |= 34; break; // cymbal
- }
- opl->write(0xbd,bd);
- }
- }
-
- del = speed; // player speed-timing
- if(pattbreak) { // do post-effect handling
- pattpos=0; // pattern break!
- pattbreak=0;
- songpos++;
- songpos %= 50;
- if(!songpos)
- songend = 1;
- } else {
- pattpos++;
- pattpos &= 63; // advance in pattern data
- if (!pattpos) {
- songpos++;
- songpos %= 50;
- if(!songpos)
- songend = 1;
- }
- }
- return !songend; // still playing
-}
-
-void ChscPlayer::rewind(int subsong)
-{
- int i; // counter
-
- // rewind HSC player
- pattpos = 0; songpos = 0; pattbreak = 0; speed = 2;
- del = 1; songend = 0; mode6 = 0; bd = 0; fadein = 0;
-
- opl->init(); // reset OPL chip
- opl->write(1,32); opl->write(8,128); opl->write(0xbd,0);
-
- for(i=0;i<9;i++)
- setinstr((char) i,(char) i); // init channels
-}
-
-unsigned int ChscPlayer::getpatterns()
-{
- unsigned char poscnt,pattcnt=0;
-
- // count patterns
- for(poscnt=0;poscnt<51 && song[poscnt] != 0xff;poscnt++)
- if(song[poscnt] > pattcnt)
- pattcnt = song[poscnt];
-
- return (pattcnt+1);
-}
-
-unsigned int ChscPlayer::getorders()
-{
- unsigned char poscnt;
-
- // count positions
- for(poscnt=0;poscnt<51;poscnt++)
- if(song[poscnt] == 0xff)
- break;
-
- return poscnt;
-}
-
-unsigned int ChscPlayer::getinstruments()
-{
- unsigned char instcnt,instnum=0,i;
- bool isinst;
-
- // count instruments
- for(instcnt=0;instcnt<128;instcnt++) {
- isinst = false;
- for(i=0;i<12;i++)
- if(instr[instcnt][i])
- isinst = true;
- if(isinst)
- instnum++;
- }
-
- return instnum;
-}
-
-/*** private methods *************************************/
-
-void ChscPlayer::setfreq(unsigned char chan, unsigned short freq)
-{
- adl_freq[chan] = (adl_freq[chan] & ~3) | (freq >> 8);
-
- opl->write(0xa0 + chan, freq & 0xff);
- opl->write(0xb0 + chan, adl_freq[chan]);
-}
-
-void ChscPlayer::setvolume(unsigned char chan, int volc, int volm)
-{
- unsigned char *ins = instr[channel[chan].inst];
- char op = op_table[chan];
-
- opl->write(0x43 + op,volc | (ins[2] & ~63));
- if (ins[8] & 1) // carrier
- opl->write(0x40 + op,volm | (ins[3] & ~63));
- else
- opl->write(0x40 + op, ins[3]); // modulator
-}
-
-void ChscPlayer::setinstr(unsigned char chan, unsigned char insnr)
-{
- unsigned char *ins = instr[insnr];
- char op = op_table[chan];
-
- channel[chan].inst = insnr; // set internal instrument
- opl->write(0xb0 + chan,0); // stop old note
-
- // set instrument
- opl->write(0xc0 + chan, ins[8]);
- opl->write(0x23 + op, ins[0]); // carrier
- opl->write(0x20 + op, ins[1]); // modulator
- opl->write(0x63 + op, ins[4]); // bits 0..3 = decay; 4..7 = attack
- opl->write(0x60 + op, ins[5]);
- opl->write(0x83 + op, ins[6]); // 0..3 = release; 4..7 = sustain
- opl->write(0x80 + op, ins[7]);
- opl->write(0xe3 + op, ins[9]); // bits 0..1 = Wellenform
- opl->write(0xe0 + op, ins[10]);
- setvolume(chan, ins[2] & 63, ins[3] & 63);
-}
diff --git a/src/adplug/core/hsc.h b/src/adplug/core/hsc.h
deleted file mode 100644
index 9b4d0d7..0000000
--- a/src/adplug/core/hsc.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * hsc.h - HSC Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_HSCPLAYER
-#define H_ADPLUG_HSCPLAYER
-
-#include "player.h"
-
-class ChscPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- ChscPlayer(Copl *newopl): CPlayer(newopl), mtkmode(0) {}
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh() { return 18.2f; }; // refresh rate is fixed at 18.2Hz
-
- std::string gettype() { return std::string("HSC Adlib Composer / HSC-Tracker"); }
- unsigned int getpatterns();
- unsigned int getpattern() { return song[songpos]; }
- unsigned int getorders();
- unsigned int getorder() { return songpos; }
- unsigned int getrow() { return pattpos; }
- unsigned int getspeed() { return speed; }
- unsigned int getinstruments();
-
- protected:
- struct hscnote {
- unsigned char note, effect;
- }; // note type in HSC pattern
-
- struct hscchan {
- unsigned char inst; // current instrument
- signed char slide; // used for manual slide-effects
- unsigned short freq; // actual replaying frequency
- }; // HSC channel data
-
- hscchan channel[9]; // player channel-info
- unsigned char instr[128][12]; // instrument data
- unsigned char song[0x80]; // song-arrangement (MPU-401 Trakker enhanced)
- hscnote patterns[50][64*9]; // pattern data
- unsigned char pattpos,songpos, // various bytes & flags
- pattbreak,songend,mode6,bd,fadein;
- unsigned int speed,del;
- unsigned char adl_freq[9]; // adlib frequency registers
- int mtkmode; // flag: MPU-401 Trakker mode on/off
-
- private:
- void setfreq(unsigned char chan, unsigned short freq);
- void setvolume(unsigned char chan, int volc, int volm);
- void setinstr(unsigned char chan, unsigned char insnr);
-};
-
-#endif
diff --git a/src/adplug/core/hsp.cc b/src/adplug/core/hsp.cc
deleted file mode 100644
index dcbda94..0000000
--- a/src/adplug/core/hsp.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * hsp.cpp - HSP Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "hsp.h"
-
-CPlayer *ChspLoader::factory(Copl *newopl)
-{
- return new ChspLoader(newopl);
-}
-
-bool ChspLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- unsigned long i, j, orgsize, filesize;
- unsigned char *cmp, *org;
-
- // file validation section
- if(!fp.extension(filename, ".hsp")) { fp.close(f); return false; }
-
- filesize = fp.filesize(f);
- orgsize = f->readInt(2);
- if(orgsize > 59187) { fp.close(f); return false; }
-
- // load section
- cmp = new unsigned char[filesize];
- for(i = 0; i < filesize; i++) cmp[i] = f->readInt(1);
- fp.close(f);
-
- org = new unsigned char[orgsize];
- for(i = 0, j = 0; i < filesize; j += cmp[i], i += 2) { // RLE decompress
- if(j >= orgsize) break; // memory boundary check
- memset(org + j, cmp[i + 1], j + cmp[i] < orgsize ? cmp[i] : orgsize - j - 1);
- }
- if (j < orgsize) {
- orgsize = j;
- }
- delete [] cmp;
-
- if (orgsize < 128 * 12 + 51) { // check decompressed size
- delete [] org;
- return false;
- }
- memcpy(instr, org, 128 * 12); // instruments
- for(i = 0; i < 128; i++) { // correct instruments
- instr[i][2] ^= (instr[i][2] & 0x40) << 1;
- instr[i][3] ^= (instr[i][3] & 0x40) << 1;
- instr[i][11] >>= 4; // slide
- }
- memcpy(song, org + 128 * 12, 51); // tracklist
- memcpy(patterns, org + 128 * 12 + 51, orgsize - 128 * 12 - 51); // patterns
- delete [] org;
-
- rewind(0);
- return true;
-}
diff --git a/src/adplug/core/hsp.h b/src/adplug/core/hsp.h
deleted file mode 100644
index 4046249..0000000
--- a/src/adplug/core/hsp.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * hsp.h: HSC Packed Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_HSPLOADER
-#define H_ADPLUG_HSPLOADER
-
-#include "hsc.h"
-
-class ChspLoader: public ChscPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- ChspLoader(Copl *newopl)
- : ChscPlayer(newopl)
- {};
-
- bool load(const std::string &filename, const CFileProvider &fp);
-};
-
-#endif
diff --git a/src/adplug/core/hybrid.cc b/src/adplug/core/hybrid.cc
deleted file mode 100644
index 79a6851..0000000
--- a/src/adplug/core/hybrid.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] HYBRID player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : HYBRID.EXE
- type : Hybrid cracktro for Apache Longbow CD-RIP
- tune : from 'Mig-29 Super Fulcrum' game by Domark
- player : from 'Mig-29 Super Fulcrum' game by Domark
-*/
-
-#include "hybrid.h"
-#include "debug.h"
-
-const unsigned char CxadhybridPlayer::hyb_adlib_registers[99] =
-{
- 0xE0, 0x60, 0x80, 0x20, 0x40, 0xE3, 0x63, 0x83, 0x23, 0x43, 0xC0,
- 0xE1, 0x61, 0x81, 0x21, 0x41, 0xE4, 0x64, 0x84, 0x24, 0x44, 0xC1,
- 0xE2, 0x62, 0x82, 0x22, 0x42, 0xE5, 0x65, 0x85, 0x25, 0x45, 0xC2,
- 0xE8, 0x68, 0x88, 0x28, 0x48, 0xEB, 0x6B, 0x8B, 0x2B, 0x4B, 0xC3,
- 0xE9, 0x69, 0x89, 0x29, 0x49, 0xEC, 0x6C, 0x8C, 0x2C, 0x4C, 0xC4,
- 0xEA, 0x6A, 0x8A, 0x2A, 0x4A, 0xED, 0x6D, 0x8D, 0x2D, 0x4D, 0xC5,
- 0xF0, 0x70, 0x90, 0x30, 0x50, 0xF3, 0x73, 0x93, 0x33, 0x53, 0xC6,
- 0xF1, 0x71, 0x91, 0x31, 0x51, 0xF4, 0x74, 0x94, 0x34, 0x54, 0xC7,
- 0xF2, 0x72, 0x92, 0x32, 0x52, 0xF5, 0x75, 0x95, 0x35, 0x55, 0xC8
-};
-
-const unsigned short CxadhybridPlayer::hyb_notes[98] =
-{
- 0x0000, 0x0000,
- 0x016B, 0x0181, 0x0198, 0x01B0, 0x01CA, 0x01E5, 0x0202, 0x0220, 0x0241, 0x0263, 0x0287, 0x02AE,
- 0x056B, 0x0581, 0x0598, 0x05B0, 0x05CA, 0x05E5, 0x0602, 0x0620, 0x0641, 0x0663, 0x0687, 0x06AE,
- 0x096B, 0x0981, 0x0998, 0x09B0, 0x09CA, 0x09E5, 0x0A02, 0x0A20, 0x0A41, 0x0A63, 0x0A87, 0x0AAE,
- 0x0D6B, 0x0D81, 0x0D98, 0x0DB0, 0x0DCA, 0x0DE5, 0x0E02, 0x0E20, 0x0E41, 0x0E63, 0x0E87, 0x0EAE,
- 0x116B, 0x1181, 0x1198, 0x11B0, 0x11CA, 0x11E5, 0x1202, 0x1220, 0x1241, 0x1263, 0x1287, 0x12AE,
- 0x156B, 0x1581, 0x1598, 0x15B0, 0x15CA, 0x15E5, 0x1602, 0x1620, 0x1641, 0x1663, 0x1687, 0x16AE,
- 0x196B, 0x1981, 0x1998, 0x19B0, 0x19CA, 0x19E5, 0x1A02, 0x1A20, 0x1A41, 0x1A63, 0x1A87, 0x1AAE,
- 0x1D6B, 0x1D81, 0x1D98, 0x1DB0, 0x1DCA, 0x1DE5, 0x1E02, 0x1E20, 0x1E41, 0x1E63, 0x1E87, 0x1EAE
-};
-
-const unsigned char CxadhybridPlayer::hyb_default_instrument[11] =
-{
- 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00
-};
-
-CPlayer *CxadhybridPlayer::factory(Copl *newopl)
-{
- return new CxadhybridPlayer(newopl);
-}
-
-bool CxadhybridPlayer::xadplayer_load()
-{
- if(xad.fmt != HYBRID)
- return false;
-
- // load instruments
- hyb.inst = (hyb_instrument *)&tune[0];
-
- // load order
- hyb.order = &tune[0x1D4];
-
- return true;
-}
-
-void CxadhybridPlayer::xadplayer_rewind(int subsong)
-{
- int i;
-
- hyb.order_pos = 0;
- hyb.pattern_pos = 0;
-
- hyb.speed = 6;
- hyb.speed_counter = 1;
-
- plr.speed = 1;
-
- // init channel data
- for(i=0;i<9;i++)
- {
- hyb.channel[i].freq = 0x2000;
- hyb.channel[i].freq_slide = 0x0000;
- }
-
- // basic OPL init
- opl_write(0x01, 0x20);
- opl_write(0xBD, 0x40);
- opl_write(0x08, 0x00);
-
- // init OPL channels
- for(i=0;i<9;i++)
- {
- for(int j=0;j<11;j++)
- opl_write(hyb_adlib_registers[i*11+j], 0x00 /* hyb_default_instrument[j] */ );
-
- opl_write(0xA0+i, 0x00);
- opl_write(0xB0+i, 0x20);
- }
-}
-
-void CxadhybridPlayer::xadplayer_update()
-{
- int i,j;
- unsigned char patpos,ordpos;
-
- if (--hyb.speed_counter)
- goto update_slides;
-
- hyb.speed_counter = hyb.speed;
-
- patpos = hyb.pattern_pos;
- ordpos = hyb.order_pos;
-
- // process channels
- for(i=0;i<9;i++)
- {
- unsigned char *pos = &tune[0xADE + (hyb.order[hyb.order_pos*9 + i] * 64 * 2) + (patpos * 2)];
- // read event
- unsigned short event = (pos[1] << 8) + pos[0];
-
-#ifdef DEBUG
- AdPlug_LogWrite("track %02X, channel %02X, event %04X:\n", hyb.order[hyb.order_pos*9 + i], i, event );
-#endif
-
- // calculate variables
- unsigned char note = event >> 9;
- unsigned char ins = ((event & 0x01F0) >> 4);
- unsigned char slide = event & 0x000F;
-
- // play event
- switch(note)
- {
- case 0x7D: // 0x7D: Set Speed
- hyb.speed = event & 0xFF;
- break;
- case 0x7E: // 0x7E: Jump Position
- hyb.order_pos = event & 0xFF;
- hyb.pattern_pos = 0x3F;
-
- // jumpback ?
- if (hyb.order_pos <= ordpos)
- plr.looping = 1;
-
- break;
- case 0x7F: // 0x7F: Pattern Break
- hyb.pattern_pos = 0x3F;
- break;
- default:
-
- // is instrument ?
- if (ins)
- for(j=0;j<11;j++)
- opl_write(hyb_adlib_registers[i*11+j], *((unsigned char *)&hyb.inst[ins-1] + 7 + j)); // +7 = skip name...
-
- // is note ?
- if (note)
- {
- hyb.channel[i].freq = hyb_notes[note];
- hyb.channel[i].freq_slide = 0;
- }
-
- // is slide ?
- if (slide)
- {
- hyb.channel[i].freq_slide = (((slide >> 3) * -1) * (slide & 7)) << 1;
-
- if (slide & 0x80)
- slide = -(slide & 7);
- }
-
- // set frequency
- if (!(hyb.channel[i].freq & 0x2000))
- {
- opl_write(0xA0+i, hyb.channel[i].freq & 0xFF);
- opl_write(0xB0+i, hyb.channel[i].freq >> 8);
-
- hyb.channel[i].freq |= 0x2000;
-
- opl_write(0xA0+i, hyb.channel[i].freq & 0xFF);
- opl_write(0xB0+i, hyb.channel[i].freq >> 8);
- }
-
- break;
- }
- }
-
- hyb.pattern_pos++;
-
- // end of pattern ?
- if (hyb.pattern_pos >= 0x40)
- {
- hyb.pattern_pos = 0;
-
- hyb.order_pos++;
- }
-
-update_slides:
-#ifdef DEBUG
- AdPlug_LogWrite("slides:\n");
-#endif
- // update fine frequency slides
- for(i=0;i<9;i++)
- if (hyb.channel[i].freq_slide)
- {
- hyb.channel[i].freq = (((hyb.channel[i].freq & 0x1FFF) + hyb.channel[i].freq_slide) & 0x1FFF) | 0x2000;
-
- opl_write(0xA0+i, hyb.channel[i].freq & 0xFF);
- opl_write(0xB0+i, hyb.channel[i].freq >> 8);
- }
-}
-
-float CxadhybridPlayer::xadplayer_getrefresh()
-{
- return 50.0f;
-}
-
-std::string CxadhybridPlayer::xadplayer_gettype()
-{
- return (std::string("xad: hybrid player"));
-}
-
-std::string CxadhybridPlayer::xadplayer_getinstrument(unsigned int i)
-{
- return (std::string(hyb.inst[i].name,7));
-}
-
-unsigned int CxadhybridPlayer::xadplayer_getinstruments()
-{
- return 26;
-}
diff --git a/src/adplug/core/hybrid.h b/src/adplug/core/hybrid.h
deleted file mode 100644
index 9a03d0d..0000000
--- a/src/adplug/core/hybrid.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] HYBRID player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadhybridPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadhybridPlayer(Copl *newopl): CxadPlayer(newopl)
- { }
-
-protected:
- struct hyb_instrument
- {
- char name[7];
- unsigned char mod_wave;
- unsigned char mod_AD;
- unsigned char mod_SR;
- unsigned char mod_crtl;
- unsigned char mod_volume;
- unsigned char car_wave;
- unsigned char car_AD;
- unsigned char car_SR;
- unsigned char car_crtl;
- unsigned char car_volume;
- unsigned char connect;
- };
-
- struct
- {
- unsigned char order_pos;
- unsigned char pattern_pos;
-
- unsigned char *order;
-
- hyb_instrument *inst;
-
- struct
- {
- unsigned short freq;
- unsigned short freq_slide;
- } channel[9];
-
- unsigned char speed;
- unsigned char speed_counter;
- } hyb;
- //
- bool xadplayer_load();
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
- std::string xadplayer_getinstrument(unsigned int i);
- unsigned int xadplayer_getinstruments();
-
-private:
- static const unsigned char hyb_adlib_registers[99];
- static const unsigned short hyb_notes[98];
- static const unsigned char hyb_default_instrument[11];
-};
diff --git a/src/adplug/core/hyp.cc b/src/adplug/core/hyp.cc
deleted file mode 100644
index f238a2d..0000000
--- a/src/adplug/core/hyp.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] HYP player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : HT-EF2.COM, HT-EF3.COM
- type : Eiserne Front BBStro
- tune : by Shadowdancer [Hypnosis]
- player : by (?)Hetero [LKCC/SAC]
-*/
-
-#include "hyp.h"
-#include "debug.h"
-
-const unsigned char CxadhypPlayer::hyp_adlib_registers[99] =
-{
- 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xA0, 0xB0, 0xC0,
- 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xA1, 0xB1, 0xC1,
- 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xA2, 0xB2, 0xC2,
- 0x28, 0x2B, 0x48, 0x4B, 0x68, 0x6B, 0x88, 0x8B, 0xA3, 0xB3, 0xC3,
- 0x29, 0x2C, 0x49, 0x4C, 0x69, 0x6C, 0x89, 0x8C, 0xA4, 0xB4, 0xC4,
- 0x2A, 0x2D, 0x4A, 0x4D, 0x6A, 0x6D, 0x8A, 0x8D, 0xA5, 0xB5, 0xC5,
- 0x30, 0x33, 0x50, 0x53, 0x70, 0x73, 0x90, 0x93, 0xA6, 0xB6, 0xC6,
- 0x31, 0x34, 0x51, 0x54, 0x71, 0x74, 0x91, 0x94, 0xA7, 0xB7, 0xC7,
- 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xA8, 0xB8, 0xC8
-};
-
-const unsigned short CxadhypPlayer::hyp_notes[73] =
-{
- 0x0000, // by riven
- 0x0956, 0x096B, 0x0980, 0x0998, 0x09B1, 0x09C9, 0x09E5, 0x0A03, 0x0A21,
- 0x0A41, 0x0A63, 0x0A86, 0x0D56, 0x0D6B, 0x0D80, 0x0D98, 0x0DB1, 0x0DC9,
- 0x0DE5, 0x0E03, 0x0E21, 0x0E41, 0x0E63, 0x0E86, 0x1156, 0x116B, 0x1180,
- 0x1198, 0x11B1, 0x11C9, 0x11E5, 0x1203, 0x1221, 0x1241, 0x1263, 0x1286,
- 0x1556, 0x156B, 0x1580, 0x1598, 0x15B1, 0x15C9, 0x15E5, 0x1603, 0x1621,
- 0x1641, 0x1663, 0x1686, 0x1956, 0x196B, 0x1980, 0x1998, 0x19B1, 0x19C9,
- 0x19E5, 0x1A03, 0x1A21, 0x1A41, 0x1A63, 0x1A86, 0x1D56, 0x1D6B, 0x1D80,
- 0x1D98, 0x1DB1, 0x1DC9, 0x1DE5, 0x1E03, 0x1E21, 0x1E41, 0x1E63, 0x1E86
-};
-
-CPlayer *CxadhypPlayer::factory(Copl *newopl)
-{
- return new CxadhypPlayer(newopl);
-}
-
-void CxadhypPlayer::xadplayer_rewind(int subsong)
-{
- int i;
-
- plr.speed = tune[5];
-
- opl_write(0xBD,0xC0);
-
- for(i=0; i<9; i++)
- adlib[0xB0+i] = 0;
-
- // define instruments
- for(i=0; i<99; i++)
- opl_write(hyp_adlib_registers[i], tune[6+i]);
-
- hyp.pointer = 0x69;
-}
-
-void CxadhypPlayer::xadplayer_update()
-{
- for(int i=0; i<9; i++)
- {
- unsigned char event = tune[hyp.pointer++];
-
- if (event)
- {
- unsigned short freq = hyp_notes[event & 0x3F];
-
- unsigned char lofreq = (freq & 0xFF);
- unsigned char hifreq = (freq >> 8);
-
- opl_write(0xB0+i, adlib[0xB0+i]);
-
- if (!(event & 0x40))
- {
- opl_write(0xA0+i, lofreq);
- opl_write(0xB0+i, hifreq | 0x20);
- }
-
- adlib[0xB0+i] &= 0xDF;
- }
- }
-
- hyp.pointer += 3;
-
- if (hyp.pointer >= tune_size)
- {
- hyp.pointer = 0x69;
- plr.looping = 1;
- }
-}
-
-float CxadhypPlayer::xadplayer_getrefresh()
-{
- return 60.0f;
-}
-
-std::string CxadhypPlayer::xadplayer_gettype()
-{
- return std::string("xad: hypnosis player");
-}
diff --git a/src/adplug/core/hyp.h b/src/adplug/core/hyp.h
deleted file mode 100644
index f3f6877..0000000
--- a/src/adplug/core/hyp.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] HYP player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadhypPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadhypPlayer(Copl *newopl): CxadPlayer(newopl)
- { }
-
-protected:
- struct
- {
- unsigned short pointer;
- } hyp;
- //
- bool xadplayer_load()
- {
- if(xad.fmt == HYP)
- return true;
- else
- return false;
- }
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
-
-private:
- static const unsigned char hyp_adlib_registers[99];
- static const unsigned short hyp_notes[73];
-};
diff --git a/src/adplug/core/imf.cc b/src/adplug/core/imf.cc
deleted file mode 100644
index 136ce2d..0000000
--- a/src/adplug/core/imf.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * imf.cpp - IMF Player by Simon Peter <dn.tlp@gmx.net>
- *
- * FILE FORMAT:
- * There seem to be 2 different flavors of IMF formats out there. One version
- * contains just the raw IMF music data. In this case, the first word of the
- * file is always 0 (because the music data starts this way). This is already
- * the music data! So read in the entire file and play it.
- *
- * If this word is greater than 0, it specifies the size of the following
- * song data in bytes. In this case, the file has a footer that contains
- * arbitrary infos about it. Mostly, this is plain ASCII text with some words
- * of the author. Read and play the specified amount of song data and display
- * the remaining data as ASCII text.
- *
- * NOTES:
- * This player handles the two above mentioned formats, as well as a third
- * type, invented by Martin Fernandez <mfernan@cnba.uba.ar>, that's got a
- * proper header to add title/game name information. After the header starts
- * the normal IMF file in one of the two above mentioned formats.
- *
- * This player also handles a special footer format by Adam Nielsen,
- * which has defined fields of information about the song, the author
- * and more.
- */
-
-#include <string.h>
-
-#include "imf.h"
-#include "database.h"
-
-/*** public methods *************************************/
-
-CPlayer *CimfPlayer::factory(Copl *newopl)
-{
- return new CimfPlayer(newopl);
-}
-
-bool CimfPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- unsigned long fsize, flsize, mfsize = 0;
- unsigned int i;
-
- // file validation section
- {
- char header[5];
- int version;
-
- f->readString(header, 5);
- version = f->readInt(1);
-
- if(strncmp(header, "ADLIB", 5) || version != 1) {
- if(!fp.extension(filename, ".imf") && !fp.extension(filename, ".wlf")) {
- // It's no IMF file at all
- fp.close(f);
- return false;
- } else
- f->seek(0); // It's a normal IMF file
- } else {
- // It's a IMF file with header
- track_name = f->readString('\0');
- game_name = f->readString('\0');
- f->ignore(1);
- mfsize = f->pos() + 2;
- }
- }
-
- // load section
- if(mfsize)
- fsize = f->readInt(4);
- else
- fsize = f->readInt(2);
- flsize = fp.filesize(f);
- if(!fsize) { // footerless file (raw music data)
- if(mfsize)
- f->seek(-4, binio::Add);
- else
- f->seek(-2, binio::Add);
- size = (flsize - mfsize) / 4;
- } else // file has got a footer
- size = fsize / 4;
-
- data = new Sdata[size];
- for(i = 0; i < size; i++) {
- data[i].reg = f->readInt(1); data[i].val = f->readInt(1);
- data[i].time = f->readInt(2);
- }
-
- // read footer, if any
- if(fsize && (fsize < flsize - 2 - mfsize)) {
- if(f->readInt(1) == 0x1a) {
- // Adam Nielsen's footer format
- track_name = f->readString();
- author_name = f->readString();
- remarks = f->readString();
- } else {
- // Generic footer
- unsigned long footerlen = flsize - fsize - 2 - mfsize;
-
- footer = new char[footerlen + 1];
- f->readString(footer, footerlen);
- footer[footerlen] = '\0'; // Make ASCIIZ string
- }
- }
-
- rate = getrate(filename, fp, f);
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CimfPlayer::update()
-{
- do {
- opl->write(data[pos].reg,data[pos].val);
- del = data[pos].time;
- pos++;
- } while(!del && pos < size);
-
- if(pos >= size) {
- pos = 0;
- songend = true;
- }
- else timer = rate / (float)del;
-
- return !songend;
-}
-
-void CimfPlayer::rewind(int subsong)
-{
- pos = 0; del = 0; timer = rate; songend = false;
- opl->init(); opl->write(1,32); // go to OPL2 mode
-}
-
-std::string CimfPlayer::gettitle()
-{
- std::string title;
-
- title = track_name;
-
- if(!track_name.empty() && !game_name.empty())
- title += " - ";
-
- title += game_name;
-
- return title;
-}
-
-std::string CimfPlayer::getdesc()
-{
- std::string desc;
-
- if(footer)
- desc = std::string(footer);
-
- if(!remarks.empty() && footer)
- desc += "\n\n";
-
- desc += remarks;
-
- return desc;
-}
-
-/*** private methods *************************************/
-
-float CimfPlayer::getrate(const std::string &filename, const CFileProvider &fp, binistream *f)
-{
- if(db) { // Database available
- f->seek(0, binio::Set);
- CClockRecord *record = (CClockRecord *)db->search(CAdPlugDatabase::CKey(*f));
- if (record && record->type == CAdPlugDatabase::CRecord::ClockSpeed)
- return record->clock;
- }
-
- // Otherwise the database is either unavailable, or there's no entry for this file
- if (fp.extension(filename, ".imf")) return 560.0f;
- if (fp.extension(filename, ".wlf")) return 700.0f;
- return 700.0f; // default speed for unknown files that aren't .IMF or .WLF
-}
diff --git a/src/adplug/core/imf.h b/src/adplug/core/imf.h
deleted file mode 100644
index 1ef63dc..0000000
--- a/src/adplug/core/imf.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * imf.h - IMF Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_IMFPLAYER
-#define H_ADPLUG_IMFPLAYER
-
-#include "player.h"
-
-class CimfPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CimfPlayer(Copl *newopl)
- : CPlayer(newopl), footer(0), data(0)
- { }
- ~CimfPlayer()
- { if(data) delete [] data; if(footer) delete [] footer; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh()
- { return timer; };
-
- std::string gettype()
- { return std::string("IMF File Format"); }
- std::string gettitle();
- std::string getauthor()
- { return author_name; }
- std::string getdesc();
-
-protected:
- unsigned long pos, size;
- unsigned short del;
- bool songend;
- float rate, timer;
- char *footer;
- std::string track_name, game_name, author_name, remarks;
-
- struct Sdata {
- unsigned char reg, val;
- unsigned short time;
- } *data;
-
-private:
- float getrate(const std::string &filename, const CFileProvider &fp, binistream *f);
-};
-
-#endif
diff --git a/src/adplug/core/jbm.cc b/src/adplug/core/jbm.cc
deleted file mode 100644
index 2b13341..0000000
--- a/src/adplug/core/jbm.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Johannes Bjerregaard's JBM Adlib Music Format player for AdPlug
- * Written by Dennis Lindroos <lindroos@nls.fi>, February-March 2007
- * - Designed and coded from scratch (only frequency-table taken from MUSIC.BIN)
- * - The percussion mode is buggy (?) but i'm not good enough to find them
- * and honestly i think the melodic-mode tunes are much better ;)
- *
- * This version doesn't use the binstr.h functions (coded with custom func.)
- * This is my first attempt on writing a musicplayer for AdPlug, and i'm not
- * coding C++ very often..
- *
- * Released under the terms of the GNU General Public License.
- */
-
-#include "jbm.h"
-
-static const unsigned short notetable[96] = {
- 0x0158, 0x016d, 0x0183, 0x019a, 0x01b2, 0x01cc, 0x01e7, 0x0204,
- 0x0223, 0x0244, 0x0266, 0x028b, 0x0558, 0x056d, 0x0583, 0x059a,
- 0x05b2, 0x05cc, 0x05e7, 0x0604, 0x0623, 0x0644, 0x0666, 0x068b,
- 0x0958, 0x096d, 0x0983, 0x099a, 0x09b2, 0x09cc, 0x09e7, 0x0a04,
- 0x0a23, 0x0a44, 0x0a66, 0x0a8b, 0x0d58, 0x0d6d, 0x0d83, 0x0d9a,
- 0x0db2, 0x0dcc, 0x0de7, 0x0e04, 0x0e23, 0x0e44, 0x0e66, 0x0e8b,
- 0x1158, 0x116d, 0x1183, 0x119a, 0x11b2, 0x11cc, 0x11e7, 0x1204,
- 0x1223, 0x1244, 0x1266, 0x128b, 0x1558, 0x156d, 0x1583, 0x159a,
- 0x15b2, 0x15cc, 0x15e7, 0x1604, 0x1623, 0x1644, 0x1666, 0x168b,
- 0x1958, 0x196d, 0x1983, 0x199a, 0x19b2, 0x19cc, 0x19e7, 0x1a04,
- 0x1a23, 0x1a44, 0x1a66, 0x1a8b, 0x1d58, 0x1d6d, 0x1d83, 0x1d9a,
- 0x1db2, 0x1dcc, 0x1de7, 0x1e04, 0x1e23, 0x1e44, 0x1e66, 0x1e8b
-};
-
-static const unsigned char percmx_tab[4] = { 0x14, 0x12, 0x15, 0x11 };
-static const unsigned char perchn_tab[5] = { 6, 7, 8, 8, 7 };
-static unsigned char percmaskoff[5] = { 0xef, 0xf7, 0xfb, 0xfd, 0xfe };
-static unsigned char percmaskon[5] = { 0x10, 0x08, 0x04, 0x02, 0x01 };
-
-static inline unsigned short GET_WORD(unsigned char *b, int x)
-{
- return ((unsigned short)(b[x+1] << 8) | b[x]);
-}
-
-/*** public methods *************************************/
-
-CPlayer *CjbmPlayer::factory(Copl *newopl)
-{
- return new CjbmPlayer(newopl);
-}
-
-bool CjbmPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- int filelen = fp.filesize(f);
- int i;
-
- if (!filelen || !fp.extension(filename, ".jbm")) goto loaderr;
-
- // Allocate memory buffer m[] and read entire file into it
-
- m = new unsigned char[filelen];
- if (f->readString((char *)m, filelen) != filelen) goto loaderr;
-
- fp.close(f);
-
- // The known .jbm files always seem to start with the number 0x0002
-
- if (GET_WORD(m, 0) != 0x0002)
- return false;
-
- // Song tempo
-
- i = GET_WORD(m, 2);
- timer = 1193810.0 / (i ? i : 0xffff);
-
- seqtable = GET_WORD(m, 4);
- instable = GET_WORD(m, 6);
-
- // The flags word has atleast 1 bit, the Adlib's rhythm mode, but
- // currently we don't support that :(
-
- flags = GET_WORD(m, 8);
-
- // Instrument datas are directly addressed with m[]
-
- inscount = (filelen - instable) >> 4;
-
- // Voice' and sequence pointers
-
- seqcount = 0xffff;
- for (i = 0; i < 11; i++) {
- voice[i].trkpos = voice[i].trkstart = GET_WORD(m, 10 + (i<<1));
- if (voice[i].trkpos && voice[i].trkpos < seqcount)
- seqcount = voice[i].trkpos;
- }
- seqcount = (seqcount - seqtable) >> 1;
- sequences = new unsigned short[seqcount];
- for (i = 0; i < seqcount; i++)
- sequences[i] = GET_WORD(m, seqtable + (i<<1));
-
- rewind(0);
- return true;
- loaderr:
- fp.close(f);
- return false;
-}
-
-bool CjbmPlayer::update()
-{
- short c, spos, frq;
-
- for (c = 0; c < 11; c++) {
- if (!voice[c].trkpos) // Unused channel
- continue;
-
- if (--voice[c].delay)
- continue;
-
- // Turn current note/percussion off
-
- if (voice[c].note&0x7f)
- opl_noteonoff(c, &voice[c], 0);
-
- // Process events until we have a note
-
- spos = voice[c].seqpos;
- while(!voice[c].delay) {
- switch(m[spos]) {
- case 0xFD: // Set Instrument
- voice[c].instr = m[spos+1];
- set_opl_instrument(c, &voice[c]);
- spos+=2;
- break;
- case 0xFF: // End of Sequence
- voice[c].seqno = m[++voice[c].trkpos];
- if (voice[c].seqno == 0xff) {
- voice[c].trkpos = voice[c].trkstart;
- voice[c].seqno = m[voice[c].trkpos];
- //voicemask &= 0x7ff-(1<<c);
- voicemask &= ~(1<<c);
- }
- spos = voice[c].seqpos = sequences[voice[c].seqno];
- break;
- default: // Note Event
- if ((m[spos] & 127) > 95)
- return 0;
-
- voice[c].note = m[spos];
- voice[c].vol = m[spos+1];
- voice[c].delay =
- (m[spos+2] + (m[spos+3]<<8)) + 1;
-
- frq = notetable[voice[c].note&127];
- voice[c].frq[0] = (unsigned char)frq;
- voice[c].frq[1] = frq >> 8;
- spos+=4;
- }
- }
- voice[c].seqpos = spos;
-
- // Write new volume to the carrier operator, or percussion
-
- if (flags&1 && c > 6)
- opl->write(0x40 + percmx_tab[c-7], voice[c].vol ^ 0x3f);
- else
- opl->write(0x43 + op_table[c], voice[c].vol ^ 0x3f);
-
- // Write new frequencies and Gate bit
-
- opl_noteonoff(c, &voice[c], !(voice[c].note & 0x80));
- }
- return (voicemask);
-}
-
-void CjbmPlayer::rewind(int subsong)
-{
- int c;
-
- voicemask = 0;
-
- for (c = 0; c < 11; c++) {
- voice[c].trkpos = voice[c].trkstart;
-
- if (!voice[c].trkpos) continue;
-
- voicemask |= (1<<c);
-
- voice[c].seqno = m[voice[c].trkpos];
- voice[c].seqpos = sequences[voice[c].seqno];
-
- voice[c].note = 0;
- voice[c].delay = 1;
- }
-
- opl->init();
- opl->write(0x01, 32);
-
- // Set rhythm mode if flags bit #0 is set
- // AM and Vibrato are full depths (taken from DosBox RAW output)
- bdreg = 0xC0 | (flags&1)<<5;
-
- opl->write(0xbd, bdreg);
-
-#if 0
- if (flags&1) {
- voice[7].frq[0] = 0x58; voice[7].frq[1] = 0x09; // XXX
- voice[8].frq[0] = 0x04; voice[8].frq[1] = 0x0a; // XXX
- opl_noteonoff(7, &voice[7], 0);
- opl_noteonoff(8, &voice[8], 0);
- }
-#endif
-
- return;
-}
-
-/*** private methods ************************************/
-
-void CjbmPlayer::opl_noteonoff(int channel, JBMVoice *v, bool state)
-{
- if (flags&1 && channel > 5) {
- // Percussion
- opl->write(0xa0 + perchn_tab[channel-6], voice[channel].frq[0]);
- opl->write(0xb0 + perchn_tab[channel-6], voice[channel].frq[1]);
- opl->write(0xbd,
- state ? bdreg | percmaskon[channel-6] :
- bdreg & percmaskoff[channel-6]);
- } else {
- // Melodic mode or Rhythm mode melodic channels
- opl->write(0xa0 + channel, voice[channel].frq[0]);
- opl->write(0xb0 + channel,
- state ? voice[channel].frq[1] | 0x20 :
- voice[channel].frq[1] & 0x1f);
- }
- return;
-}
-
-
-void CjbmPlayer::set_opl_instrument(int channel, JBMVoice *v)
-{
- short i = instable + (v->instr << 4);
-
- // Sanity check on instr number - or we'll be reading outside m[] !
-
- if (v->instr >= inscount)
- return;
-
- // For rhythm mode, multiplexed drums. I don't care about waveforms!
- if ((flags&1) & (channel > 6)) {
- opl->write(0x20 + percmx_tab[channel-7], m[i+0]);
- opl->write(0x40 + percmx_tab[channel-7], m[i+1] ^ 0x3f);
- opl->write(0x60 + percmx_tab[channel-7], m[i+2]);
- opl->write(0x80 + percmx_tab[channel-7], m[i+3]);
-
- opl->write(0xc0 + perchn_tab[channel-6], m[i+8]&15);
- return;
- }
-
- // AM/VIB/EG/KSR/FRQMUL, KSL/OUTPUT, ADSR for 1st operator
- opl->write(0x20 + op_table[channel], m[i+0]);
- opl->write(0x40 + op_table[channel], m[i+1] ^ 0x3f);
- opl->write(0x60 + op_table[channel], m[i+2]);
- opl->write(0x80 + op_table[channel], m[i+3]);
-
- // AM/VIB/EG/KSR/FRQMUL, KSL/OUTPUT, ADSR for 2nd operator
- opl->write(0x23 + op_table[channel], m[i+4]);
- opl->write(0x43 + op_table[channel], m[i+5] ^ 0x3f);
- opl->write(0x63 + op_table[channel], m[i+6]);
- opl->write(0x83 + op_table[channel], m[i+7]);
-
- // WAVEFORM for operators
- opl->write(0xe0 + op_table[channel], (m[i+8]>>4)&3);
- opl->write(0xe3 + op_table[channel], (m[i+8]>>6)&3);
-
- // FEEDBACK/FM mode
- opl->write(0xc0 + channel, m[i+8]&15);
-
- return;
-}
diff --git a/src/adplug/core/jbm.h b/src/adplug/core/jbm.h
deleted file mode 100644
index a1d34d3..0000000
--- a/src/adplug/core/jbm.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * jbm.h - JBM Player by Dennis Lindroos <lindroos@nls.fi>
- */
-
-#ifndef H_ADPLUG_JBMPLAYER
-#define H_ADPLUG_JBMPLAYER
-
-#include "player.h"
-
-class CjbmPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CjbmPlayer(Copl *newopl) : CPlayer(newopl), m(0)
- { }
- ~CjbmPlayer()
- { if(m != NULL) delete [] m; }
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
-
- float getrefresh()
- { return timer; }
-
- std::string gettype()
- {
- return std::string(flags&1 ? "JBM Adlib Music [rhythm mode]" :
- "JBM Adlib Music");
- }
- std::string getauthor()
- { return std::string("Johannes Bjerregaard"); }
-
- protected:
-
- unsigned char *m;
- float timer;
- unsigned short flags, voicemask;
- unsigned short seqtable, seqcount;
- unsigned short instable, inscount;
- unsigned short *sequences;
- unsigned char bdreg;
-
- typedef struct {
- unsigned short trkpos, trkstart, seqpos;
- unsigned char seqno, note;
- short vol;
- short delay;
- short instr;
- unsigned char frq[2];
- unsigned char ivol, dummy;
- } JBMVoice;
-
- JBMVoice voice[11];
-
- private:
- //void calc_opl_frequency(JBMVoice *);
- void set_opl_instrument(int, JBMVoice *);
- void opl_noteonoff(int, JBMVoice *, bool);
-};
-
-#endif
diff --git a/src/adplug/core/kemuopl.h b/src/adplug/core/kemuopl.h
deleted file mode 100644
index 86461be..0000000
--- a/src/adplug/core/kemuopl.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * kemuopl.h - Emulated OPL using Ken Silverman's emulator, by Simon Peter
- * <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_KEMUOPL
-#define H_ADPLUG_KEMUOPL
-
-#include "opl.h"
-extern "C" {
-#include "adlibemu.h"
-}
-
-class CKemuopl: public Copl
-{
-public:
- CKemuopl(int rate, bool bit16, bool usestereo)
- : use16bit(bit16), stereo(usestereo)
- {
- adlibinit(rate, usestereo ? 2 : 1, bit16 ? 2 : 1);
- currType = TYPE_OPL2;
- };
-
- void update(short *buf, int samples)
- {
- if(use16bit) samples *= 2;
- if(stereo) samples *= 2;
- adlibgetsample(buf, samples);
- }
-
- // template methods
- void write(int reg, int val)
- {
- if(currChip == 0)
- adlib0(reg, val);
- };
-
- void init() {};
-
-private:
- bool use16bit,stereo;
-};
-
-#endif
diff --git a/src/adplug/core/ksm.cc b/src/adplug/core/ksm.cc
deleted file mode 100644
index e709323..0000000
--- a/src/adplug/core/ksm.cc
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * ksm.cpp - KSM Player for AdPlug by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "ksm.h"
-#include "debug.h"
-
-const unsigned int CksmPlayer::adlibfreq[63] = {
- 0,
- 2390,2411,2434,2456,2480,2506,2533,2562,2592,2625,2659,2695,
- 3414,3435,3458,3480,3504,3530,3557,3586,3616,3649,3683,3719,
- 4438,4459,4482,4504,4528,4554,4581,4610,4640,4673,4707,4743,
- 5462,5483,5506,5528,5552,5578,5605,5634,5664,5697,5731,5767,
- 6486,6507,6530,6552,6576,6602,6629,6658,6688,6721,6755,6791,
- 7510};
-
-/*** public methods **************************************/
-
-CPlayer *CksmPlayer::factory(Copl *newopl)
-{
- return new CksmPlayer(newopl);
-}
-
-bool CksmPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f;
- int i;
- char *fn = new char[filename.length() + 9];
-
- // file validation section
- if(!fp.extension(filename, ".ksm")) {
- AdPlug_LogWrite("CksmPlayer::load(,\"%s\"): File doesn't have '.ksm' "
- "extension! Rejected!\n", filename.c_str());
- delete [] fn;
- return false;
- }
- AdPlug_LogWrite("*** CksmPlayer::load(,\"%s\") ***\n", filename.c_str());
-
- // Load instruments from 'insts.dat'
- strcpy(fn, filename.c_str());
- for(i = strlen(fn) - 1; i >= 0; i--)
- if(fn[i] == '/' || fn[i] == '\\')
- break;
- strcpy(fn + i + 1, "insts.dat");
- AdPlug_LogWrite("Instruments file: \"%s\"\n", fn);
- f = fp.open(fn);
- delete [] fn;
- if(!f) {
- AdPlug_LogWrite("Couldn't open instruments file! Aborting!\n");
- AdPlug_LogWrite("--- CksmPlayer::load ---\n");
- return false;
- }
- loadinsts(f);
- fp.close(f);
-
- f = fp.open(filename); if(!f) return false;
- for(i = 0; i < 16; i++) trinst[i] = f->readInt(1);
- for(i = 0; i < 16; i++) trquant[i] = f->readInt(1);
- for(i = 0; i < 16; i++) trchan[i] = f->readInt(1);
- f->ignore(16);
- for(i = 0; i < 16; i++) trvol[i] = f->readInt(1);
- numnotes = f->readInt(2);
- note = new unsigned long [numnotes];
- for(i = 0; i < numnotes; i++) note[i] = f->readInt(4);
- fp.close(f);
-
- if(!trchan[11]) {
- drumstat = 0;
- numchans = 9;
- } else {
- drumstat = 32;
- numchans = 6;
- }
-
- rewind(0);
- AdPlug_LogWrite("--- CksmPlayer::load ---\n");
- return true;
-}
-
-bool CksmPlayer::update()
-{
- int quanter,chan,drumnum,freq,track,volevel,volval;
- unsigned int i,j,bufnum;
- unsigned long temp,templong;
-
- count++;
- if (count >= countstop)
- {
- bufnum = 0;
- while (count >= countstop)
- {
- templong = note[nownote];
- track = (int)((templong>>8)&15);
- if ((templong&192) == 0)
- {
- i = 0;
-
- while ((i < numchans) &&
- ((chanfreq[i] != (templong&63)) ||
- (chantrack[i] != ((templong>>8)&15))))
- i++;
- if (i < numchans)
- {
- databuf[bufnum] = (char)0; bufnum++;
- databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++;
- databuf[bufnum] = (unsigned char)((adlibfreq[templong&63]>>8)&223); bufnum++;
- chanfreq[i] = 0;
- chanage[i] = 0;
- }
- }
- else
- {
- volevel = trvol[track];
- if ((templong&192) == 128)
- {
- volevel -= 4;
- if (volevel < 0)
- volevel = 0;
- }
- if ((templong&192) == 192)
- {
- volevel += 4;
- if (volevel > 63)
- volevel = 63;
- }
- if (track < 11)
- {
- temp = 0;
- i = numchans;
- for(j=0;j<numchans;j++)
- if ((countstop - chanage[j] >= temp) && (chantrack[j] == track))
- {
- temp = countstop - chanage[j];
- i = j;
- }
- if (i < numchans)
- {
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++;
- databuf[bufnum] = (unsigned char)0; bufnum++;
- volval = (inst[trinst[track]][1]&192)+(volevel^63);
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0x40+op_table[i]+3); bufnum++;
- databuf[bufnum] = (unsigned char)volval; bufnum++;
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xa0+i); bufnum++;
- databuf[bufnum] = (unsigned char)(adlibfreq[templong&63]&255); bufnum++;
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xb0+i); bufnum++;
- databuf[bufnum] = (unsigned char)((adlibfreq[templong&63]>>8)|32); bufnum++;
- chanfreq[i] = templong&63;
- chanage[i] = countstop;
- }
- }
- else if ((drumstat&32) > 0)
- {
- freq = adlibfreq[templong&63];
- switch(track)
- {
- case 11: drumnum = 16; chan = 6; freq -= 2048; break;
- case 12: drumnum = 8; chan = 7; freq -= 2048; break;
- case 13: drumnum = 4; chan = 8; break;
- case 14: drumnum = 2; chan = 8; break;
- case 15: drumnum = 1; chan = 7; freq -= 2048; break;
- }
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xa0+chan); bufnum++;
- databuf[bufnum] = (unsigned char)(freq&255); bufnum++;
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xb0+chan); bufnum++;
- databuf[bufnum] = (unsigned char)((freq>>8)&223); bufnum++;
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xbd); bufnum++;
- databuf[bufnum] = (unsigned char)(drumstat&(255-drumnum)); bufnum++;
- drumstat |= drumnum;
- if ((track == 11) || (track == 12) || (track == 14))
- {
- volval = (inst[trinst[track]][1]&192)+(volevel^63);
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0x40+op_table[chan]+3); bufnum++;
- databuf[bufnum] = (unsigned char)(volval); bufnum++;
- }
- else
- {
- volval = (inst[trinst[track]][6]&192)+(volevel^63);
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0x40+op_table[chan]); bufnum++;
- databuf[bufnum] = (unsigned char)(volval); bufnum++;
- }
- databuf[bufnum] = (char)0, bufnum++;
- databuf[bufnum] = (unsigned char)(0xbd); bufnum++;
- databuf[bufnum] = (unsigned char)(drumstat); bufnum++;
- }
- }
- nownote++;
- if (nownote >= numnotes) {
- nownote = 0;
- songend = true;
- }
- templong = note[nownote];
- if (nownote == 0)
- count = (templong>>12)-1;
- quanter = (240/trquant[(templong>>8)&15]);
- countstop = (((templong>>12)+(quanter>>1)) / quanter) * quanter;
- }
- for(i=0;i<bufnum;i+=3)
- opl->write(databuf[i+1],databuf[i+2]);
- }
- return !songend;
-}
-
-void CksmPlayer::rewind(int subsong)
-{
- unsigned int i,j,k;
- unsigned char instbuf[11];
- unsigned long templong;
-
- songend = false;
- opl->init(); opl->write(1,32); opl->write(4,0); opl->write(8,0); opl->write(0xbd,drumstat);
-
- if (trchan[11] == 1) {
- for(i=0;i<11;i++)
- instbuf[i] = inst[trinst[11]][i];
- instbuf[1] = ((instbuf[1]&192)|((trvol[11])^63));
- setinst(6,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]);
- for(i=0;i<5;i++)
- instbuf[i] = inst[trinst[12]][i];
- for(i=5;i<11;i++)
- instbuf[i] = inst[trinst[15]][i];
- instbuf[1] = ((instbuf[1]&192)|((trvol[12])^63));
- instbuf[6] = ((instbuf[6]&192)|((trvol[15])^63));
- setinst(7,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]);
- for(i=0;i<5;i++)
- instbuf[i] = inst[trinst[14]][i];
- for(i=5;i<11;i++)
- instbuf[i] = inst[trinst[13]][i];
- instbuf[1] = ((instbuf[1]&192)|((trvol[14])^63));
- instbuf[6] = ((instbuf[6]&192)|((trvol[13])^63));
- setinst(8,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]);
- }
-
- for(i=0;i<numchans;i++)
- {
- chantrack[i] = 0;
- chanage[i] = 0;
- }
- j = 0;
- for(i=0;i<16;i++)
- if ((trchan[i] > 0) && (j < numchans))
- {
- k = trchan[i];
- while ((j < numchans) && (k > 0))
- {
- chantrack[j] = i;
- k--;
- j++;
- }
- }
- for(i=0;i<numchans;i++)
- {
- for(j=0;j<11;j++)
- instbuf[j] = inst[trinst[chantrack[i]]][j];
- instbuf[1] = ((instbuf[1]&192)|(63-trvol[chantrack[i]]));
- setinst(i,instbuf[0],instbuf[1],instbuf[2],instbuf[3],instbuf[4],instbuf[5],instbuf[6],instbuf[7],instbuf[8],instbuf[9],instbuf[10]);
- chanfreq[i] = 0;
- }
- k = 0;
- templong = *note;
- count = (templong>>12)-1;
- countstop = (templong>>12)-1;
- nownote = 0;
-}
-
-std::string CksmPlayer::getinstrument(unsigned int n)
-{
- if(trchan[n])
- return std::string(instname[trinst[n]]);
- else
- return std::string();
-}
-
-/*** private methods *************************************/
-
-void CksmPlayer::loadinsts(binistream *f)
-{
- int i, j;
-
- for(i = 0; i < 256; i++) {
- f->readString(instname[i], 20);
- for(j = 0; j < 11; j++) inst[i][j] = f->readInt(1);
- f->ignore(2);
- }
-}
-
-void CksmPlayer::setinst(int chan,
- unsigned char v0,unsigned char v1,unsigned char v2,
- unsigned char v3,unsigned char v4,unsigned char v5,
- unsigned char v6,unsigned char v7,unsigned char v8,
- unsigned char v9,unsigned char v10)
-{
- int offs;
-
- opl->write(0xa0+chan,0);
- opl->write(0xb0+chan,0);
- opl->write(0xc0+chan,v10);
- offs = op_table[chan];
- opl->write(0x20+offs,v5);
- opl->write(0x40+offs,v6);
- opl->write(0x60+offs,v7);
- opl->write(0x80+offs,v8);
- opl->write(0xe0+offs,v9);
- offs+=3;
- opl->write(0x20+offs,v0);
- opl->write(0x40+offs,v1);
- opl->write(0x60+offs,v2);
- opl->write(0x80+offs,v3);
- opl->write(0xe0+offs,v4);
-}
diff --git a/src/adplug/core/ksm.h b/src/adplug/core/ksm.h
deleted file mode 100644
index f97e4c4..0000000
--- a/src/adplug/core/ksm.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * ksm.h - KSM Player for AdPlug by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CksmPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CksmPlayer(Copl *newopl)
- : CPlayer(newopl), note(0)
- { };
- ~CksmPlayer()
- { if(note) delete [] note; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh()
- { return 240.0f; };
-
- std::string gettype()
- { return std::string("Ken Silverman's Music Format"); };
- unsigned int getinstruments()
- { return 16; };
- std::string getinstrument(unsigned int n);
-
-private:
- static const unsigned int adlibfreq[63];
-
- unsigned long count,countstop,chanage[18],*note;
- unsigned short numnotes;
- unsigned int nownote,numchans,drumstat;
- unsigned char trinst[16],trquant[16],trchan[16],trvol[16],inst[256][11],databuf[2048],chanfreq[18],chantrack[18];
- char instname[256][20];
-
- bool songend;
-
- void loadinsts(binistream *f);
- void setinst(int chan,unsigned char v0,unsigned char v1,unsigned char v2,unsigned char v3,
- unsigned char v4,unsigned char v5,unsigned char v6,unsigned char v7,
- unsigned char v8,unsigned char v9,unsigned char v10);
-};
diff --git a/src/adplug/core/lds.cc b/src/adplug/core/lds.cc
deleted file mode 100644
index 1f89d23..0000000
--- a/src/adplug/core/lds.cc
+++ /dev/null
@@ -1,678 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * lds.cpp - LOUDNESS Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "lds.h"
-#include "debug.h"
-
-// Note frequency table (16 notes / octave)
-const unsigned short CldsPlayer::frequency[] = {
- 343, 344, 345, 347, 348, 349, 350, 352, 353, 354, 356, 357, 358,
- 359, 361, 362, 363, 365, 366, 367, 369, 370, 371, 373, 374, 375,
- 377, 378, 379, 381, 382, 384, 385, 386, 388, 389, 391, 392, 393,
- 395, 396, 398, 399, 401, 402, 403, 405, 406, 408, 409, 411, 412,
- 414, 415, 417, 418, 420, 421, 423, 424, 426, 427, 429, 430, 432,
- 434, 435, 437, 438, 440, 442, 443, 445, 446, 448, 450, 451, 453,
- 454, 456, 458, 459, 461, 463, 464, 466, 468, 469, 471, 473, 475,
- 476, 478, 480, 481, 483, 485, 487, 488, 490, 492, 494, 496, 497,
- 499, 501, 503, 505, 506, 508, 510, 512, 514, 516, 518, 519, 521,
- 523, 525, 527, 529, 531, 533, 535, 537, 538, 540, 542, 544, 546,
- 548, 550, 552, 554, 556, 558, 560, 562, 564, 566, 568, 571, 573,
- 575, 577, 579, 581, 583, 585, 587, 589, 591, 594, 596, 598, 600,
- 602, 604, 607, 609, 611, 613, 615, 618, 620, 622, 624, 627, 629,
- 631, 633, 636, 638, 640, 643, 645, 647, 650, 652, 654, 657, 659,
- 662, 664, 666, 669, 671, 674, 676, 678, 681, 683
-};
-
-// Vibrato (sine) table
-const unsigned char CldsPlayer::vibtab[] = {
- 0, 13, 25, 37, 50, 62, 74, 86, 98, 109, 120, 131, 142, 152, 162,
- 171, 180, 189, 197, 205, 212, 219, 225, 231, 236, 240, 244, 247,
- 250, 252, 254, 255, 255, 255, 254, 252, 250, 247, 244, 240, 236,
- 231, 225, 219, 212, 205, 197, 189, 180, 171, 162, 152, 142, 131,
- 120, 109, 98, 86, 74, 62, 50, 37, 25, 13
-};
-
-// Tremolo (sine * sine) table
-const unsigned char CldsPlayer::tremtab[] = {
- 0, 0, 1, 1, 2, 4, 5, 7, 10, 12, 15, 18, 21, 25, 29, 33, 37, 42, 47,
- 52, 57, 62, 67, 73, 79, 85, 90, 97, 103, 109, 115, 121, 128, 134,
- 140, 146, 152, 158, 165, 170, 176, 182, 188, 193, 198, 203, 208,
- 213, 218, 222, 226, 230, 234, 237, 240, 243, 245, 248, 250, 251,
- 253, 254, 254, 255, 255, 255, 254, 254, 253, 251, 250, 248, 245,
- 243, 240, 237, 234, 230, 226, 222, 218, 213, 208, 203, 198, 193,
- 188, 182, 176, 170, 165, 158, 152, 146, 140, 134, 127, 121, 115,
- 109, 103, 97, 90, 85, 79, 73, 67, 62, 57, 52, 47, 42, 37, 33, 29,
- 25, 21, 18, 15, 12, 10, 7, 5, 4, 2, 1, 1, 0
-};
-
-// 'maxsound' is maximum number of patches (instruments)
-// 'maxpos' is maximum number of entries in position list (orderlist)
-const unsigned short CldsPlayer::maxsound = 0x3f, CldsPlayer::maxpos = 0xff;
-
-/*** public methods *************************************/
-
-CldsPlayer::CldsPlayer(Copl *newopl)
- : CPlayer(newopl), soundbank(0), positions(0), patterns(0)
-{
-}
-
-CldsPlayer::~CldsPlayer()
-{
- if(soundbank) delete [] soundbank;
- if(positions) delete [] positions;
- if(patterns) delete [] patterns;
-}
-
-bool CldsPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f;
- unsigned int i, j;
- SoundBank *sb;
-
- // file validation section (actually just an extension check)
- if(!fp.extension(filename, ".lds")) return false;
- f = fp.open(filename); if(!f) return false;
-
- // file load section (header)
- mode = f->readInt(1);
- if(mode > 2) { fp.close(f); return false; }
- speed = f->readInt(2);
- tempo = f->readInt(1);
- pattlen = f->readInt(1);
- for(i = 0; i < 9; i++) chandelay[i] = f->readInt(1);
- regbd = f->readInt(1);
-
- // load patches
- numpatch = f->readInt(2);
- soundbank = new SoundBank[numpatch];
- for(i = 0; i < numpatch; i++) {
- sb = &soundbank[i];
- sb->mod_misc = f->readInt(1); sb->mod_vol = f->readInt(1);
- sb->mod_ad = f->readInt(1); sb->mod_sr = f->readInt(1);
- sb->mod_wave = f->readInt(1); sb->car_misc = f->readInt(1);
- sb->car_vol = f->readInt(1); sb->car_ad = f->readInt(1);
- sb->car_sr = f->readInt(1); sb->car_wave = f->readInt(1);
- sb->feedback = f->readInt(1); sb->keyoff = f->readInt(1);
- sb->portamento = f->readInt(1); sb->glide = f->readInt(1);
- sb->finetune = f->readInt(1); sb->vibrato = f->readInt(1);
- sb->vibdelay = f->readInt(1); sb->mod_trem = f->readInt(1);
- sb->car_trem = f->readInt(1); sb->tremwait = f->readInt(1);
- sb->arpeggio = f->readInt(1);
- for(j = 0; j < 12; j++) sb->arp_tab[j] = f->readInt(1);
- sb->start = f->readInt(2); sb->size = f->readInt(2);
- sb->fms = f->readInt(1); sb->transp = f->readInt(2);
- sb->midinst = f->readInt(1); sb->midvelo = f->readInt(1);
- sb->midkey = f->readInt(1); sb->midtrans = f->readInt(1);
- sb->middum1 = f->readInt(1); sb->middum2 = f->readInt(1);
- }
-
- // load positions
- numposi = f->readInt(2);
- positions = new Position[9 * numposi];
- for(i = 0; i < numposi; i++)
- for(j = 0; j < 9; j++) {
- /*
- * patnum is a pointer inside the pattern space, but patterns are 16bit
- * word fields anyway, so it ought to be an even number (hopefully) and
- * we can just divide it by 2 to get our array index of 16bit words.
- */
- positions[i * 9 + j].patnum = f->readInt(2) / 2;
- positions[i * 9 + j].transpose = f->readInt(1);
- }
-
- AdPlug_LogWrite("CldsPlayer::load(\"%s\",fp): loading LOUDNESS file: mode = "
- "%d, pattlen = %d, numpatch = %d, numposi = %d\n",
- filename.c_str(), mode, pattlen, numpatch, numposi);
-
- // load patterns
- f->ignore(2); // ignore # of digital sounds (not played by this player)
- patterns = new unsigned short[(fp.filesize(f) - f->pos()) / 2 + 1];
- for(i = 0; !f->eof(); i++)
- patterns[i] = f->readInt(2);
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CldsPlayer::update()
-{
- unsigned short comword, freq, octave, chan, tune, wibc, tremc, arpreg;
- bool vbreak;
- unsigned char level, regnum, comhi, comlo;
- int i;
- Channel *c;
-
- if(!playing) return false;
-
- // handle fading
- if(fadeonoff) {
- if(fadeonoff <= 128) {
- if(allvolume > fadeonoff || allvolume == 0)
- allvolume -= fadeonoff;
- else {
- allvolume = 1;
- fadeonoff = 0;
- if(hardfade != 0) {
- playing = false;
- hardfade = 0;
- for(i = 0; i < 9; i++)
- channel[i].keycount = 1;
- }
- }
- } else
- if(((allvolume + (0x100 - fadeonoff)) & 0xff) <= mainvolume)
- allvolume += 0x100 - fadeonoff;
- else {
- allvolume = mainvolume;
- fadeonoff = 0;
- }
- }
-
- // handle channel delay
- for(chan = 0; chan < 9; chan++) {
- c = &channel[chan];
- if(c->chancheat.chandelay)
- if(!(--c->chancheat.chandelay))
- playsound(c->chancheat.sound, chan, c->chancheat.high);
- }
-
- // handle notes
- if(!tempo_now) {
- vbreak = false;
- for(chan = 0; chan < 9; chan++) {
- c = &channel[chan];
- if(!c->packwait) {
- unsigned short patnum = positions[posplay * 9 + chan].patnum;
- unsigned char transpose = positions[posplay * 9 + chan].transpose;
-
- comword = patterns[patnum + c->packpos];
- comhi = comword >> 8; comlo = comword & 0xff;
- if(comword) {
- if(comhi == 0x80)
- c->packwait = comlo;
- else
- if(comhi >= 0x80) {
- switch(comhi) {
- case 0xff:
- c->volcar = (((c->volcar & 0x3f) * comlo) >> 6) & 0x3f;
- if(fmchip[0xc0 + chan] & 1)
- c->volmod = (((c->volmod & 0x3f) * comlo) >> 6) & 0x3f;
- break;
- case 0xfe:
- tempo = comword & 0x3f;
- break;
- case 0xfd:
- c->nextvol = comlo;
- break;
- case 0xfc:
- playing = false;
- // in real player there's also full keyoff here, but we don't need it
- break;
- case 0xfb:
- c->keycount = 1;
- break;
- case 0xfa:
- vbreak = true;
- jumppos = (posplay + 1) & maxpos;
- break;
- case 0xf9:
- vbreak = true;
- jumppos = comlo & maxpos;
- jumping = 1;
- if(jumppos < posplay) songlooped = true;
- break;
- case 0xf8:
- c->lasttune = 0;
- break;
- case 0xf7:
- c->vibwait = 0;
- // PASCAL: c->vibspeed = ((comlo >> 4) & 15) + 2;
- c->vibspeed = (comlo >> 4) + 2;
- c->vibrate = (comlo & 15) + 1;
- break;
- case 0xf6:
- c->glideto = comlo;
- break;
- case 0xf5:
- c->finetune = comlo;
- break;
- case 0xf4:
- if(!hardfade) {
- allvolume = mainvolume = comlo;
- fadeonoff = 0;
- }
- break;
- case 0xf3:
- if(!hardfade) fadeonoff = comlo;
- break;
- case 0xf2:
- c->trmstay = comlo;
- break;
- case 0xf1: // panorama
- case 0xf0: // progch
- // MIDI commands (unhandled)
- AdPlug_LogWrite("CldsPlayer(): not handling MIDI command 0x%x, "
- "value = 0x%x\n", comhi, comlo);
- break;
- default:
- if(comhi < 0xa0)
- c->glideto = comhi & 0x1f;
- else
- AdPlug_LogWrite("CldsPlayer(): unknown command 0x%x encountered!"
- " value = 0x%x\n", comhi, comlo);
- break;
- }
- } else {
- unsigned char sound;
- unsigned short high;
- signed char transp = transpose & 127;
-
- /*
- * Originally, in assembler code, the player first shifted
- * logically left the transpose byte by 1 and then shifted
- * arithmetically right the same byte to achieve the final,
- * signed transpose value. Since we can't do arithmetic shifts
- * in C, we just duplicate the 7th bit into the 8th one and
- * discard the 8th one completely.
- */
-
- if(transpose & 64) transp |= 128;
-
- if(transpose & 128) {
- sound = (comlo + transp) & maxsound;
- high = comhi << 4;
- } else {
- sound = comlo & maxsound;
- high = (comhi + transp) << 4;
- }
-
- /*
- PASCAL:
- sound = comlo & maxsound;
- high = (comhi + (((transpose + 0x24) & 0xff) - 0x24)) << 4;
- */
-
- if(!chandelay[chan])
- playsound(sound, chan, high);
- else {
- c->chancheat.chandelay = chandelay[chan];
- c->chancheat.sound = sound;
- c->chancheat.high = high;
- }
- }
- }
-
- c->packpos++;
- } else
- c->packwait--;
- }
-
- tempo_now = tempo;
- /*
- The continue table is updated here, but this is only used in the
- original player, which can be paused in the middle of a song and then
- unpaused. Since AdPlug does all this for us automatically, we don't
- have a continue table here. The continue table update code is noted
- here for reference only.
-
- if(!pattplay) {
- conttab[speed & maxcont].position = posplay & 0xff;
- conttab[speed & maxcont].tempo = tempo;
- }
- */
- pattplay++;
- if(vbreak) {
- pattplay = 0;
- for(i = 0; i < 9; i++) channel[i].packpos = channel[i].packwait = 0;
- posplay = jumppos;
- } else
- if(pattplay >= pattlen) {
- pattplay = 0;
- for(i = 0; i < 9; i++) channel[i].packpos = channel[i].packwait = 0;
- posplay = (posplay + 1) & maxpos;
- }
- } else
- tempo_now--;
-
- // make effects
- for(chan = 0; chan < 9; chan++) {
- c = &channel[chan];
- regnum = op_table[chan];
- if(c->keycount > 0) {
- if(c->keycount == 1)
- setregs_adv(0xb0 + chan, 0xdf, 0);
- c->keycount--;
- }
-
- // arpeggio
- if(c->arp_size == 0)
- arpreg = 0;
- else {
- arpreg = c->arp_tab[c->arp_pos] << 4;
- if(arpreg == 0x800) {
- if(c->arp_pos > 0) c->arp_tab[0] = c->arp_tab[c->arp_pos - 1];
- c->arp_size = 1; c->arp_pos = 0;
- arpreg = c->arp_tab[0] << 4;
- }
-
- if(c->arp_count == c->arp_speed) {
- c->arp_pos++;
- if(c->arp_pos >= c->arp_size) c->arp_pos = 0;
- c->arp_count = 0;
- } else
- c->arp_count++;
- }
-
- // glide & portamento
- if(c->lasttune && (c->lasttune != c->gototune)) {
- if(c->lasttune > c->gototune) {
- if(c->lasttune - c->gototune < c->portspeed)
- c->lasttune = c->gototune;
- else
- c->lasttune -= c->portspeed;
- } else {
- if(c->gototune - c->lasttune < c->portspeed)
- c->lasttune = c->gototune;
- else
- c->lasttune += c->portspeed;
- }
-
- if(arpreg >= 0x800)
- arpreg = c->lasttune - (arpreg ^ 0xff0) - 16;
- else
- arpreg += c->lasttune;
-
- freq = frequency[arpreg % (12 * 16)];
- octave = arpreg / (12 * 16) - 1;
- setregs(0xa0 + chan, freq & 0xff);
- setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf);
- } else {
- // vibrato
- if(!c->vibwait) {
- if(c->vibrate) {
- wibc = vibtab[c->vibcount & 0x3f] * c->vibrate;
-
- if((c->vibcount & 0x40) == 0)
- tune = c->lasttune + (wibc >> 8);
- else
- tune = c->lasttune - (wibc >> 8);
-
- if(arpreg >= 0x800)
- tune = tune - (arpreg ^ 0xff0) - 16;
- else
- tune += arpreg;
-
- freq = frequency[tune % (12 * 16)];
- octave = tune / (12 * 16) - 1;
- setregs(0xa0 + chan, freq & 0xff);
- setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf);
- c->vibcount += c->vibspeed;
- } else
- if(c->arp_size != 0) { // no vibrato, just arpeggio
- if(arpreg >= 0x800)
- tune = c->lasttune - (arpreg ^ 0xff0) - 16;
- else
- tune = c->lasttune + arpreg;
-
- freq = frequency[tune % (12 * 16)];
- octave = tune / (12 * 16) - 1;
- setregs(0xa0 + chan, freq & 0xff);
- setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf);
- }
- } else { // no vibrato, just arpeggio
- c->vibwait--;
-
- if(c->arp_size != 0) {
- if(arpreg >= 0x800)
- tune = c->lasttune - (arpreg ^ 0xff0) - 16;
- else
- tune = c->lasttune + arpreg;
-
- freq = frequency[tune % (12 * 16)];
- octave = tune / (12 * 16) - 1;
- setregs(0xa0 + chan, freq & 0xff);
- setregs_adv(0xb0 + chan, 0x20, ((octave << 2) + (freq >> 8)) & 0xdf);
- }
- }
- }
-
- // tremolo (modulator)
- if(!c->trmwait) {
- if(c->trmrate) {
- tremc = tremtab[c->trmcount & 0x7f] * c->trmrate;
- if((tremc >> 8) <= (c->volmod & 0x3f))
- level = (c->volmod & 0x3f) - (tremc >> 8);
- else
- level = 0;
-
- if(allvolume != 0 && (fmchip[0xc0 + chan] & 1))
- setregs_adv(0x40 + regnum, 0xc0, ((level * allvolume) >> 8) ^ 0x3f);
- else
- setregs_adv(0x40 + regnum, 0xc0, level ^ 0x3f);
-
- c->trmcount += c->trmspeed;
- } else
- if(allvolume != 0 && (fmchip[0xc0 + chan] & 1))
- setregs_adv(0x40 + regnum, 0xc0, ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f);
- else
- setregs_adv(0x40 + regnum, 0xc0, (c->volmod ^ 0x3f) & 0x3f);
- } else {
- c->trmwait--;
- if(allvolume != 0 && (fmchip[0xc0 + chan] & 1))
- setregs_adv(0x40 + regnum, 0xc0, ((((c->volmod & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f);
- }
-
- // tremolo (carrier)
- if(!c->trcwait) {
- if(c->trcrate) {
- tremc = tremtab[c->trccount & 0x7f] * c->trcrate;
- if((tremc >> 8) <= (c->volcar & 0x3f))
- level = (c->volcar & 0x3f) - (tremc >> 8);
- else
- level = 0;
-
- if(allvolume != 0)
- setregs_adv(0x43 + regnum, 0xc0, ((level * allvolume) >> 8) ^ 0x3f);
- else
- setregs_adv(0x43 + regnum, 0xc0, level ^ 0x3f);
- c->trccount += c->trcspeed;
- } else
- if(allvolume != 0)
- setregs_adv(0x43 + regnum, 0xc0, ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f);
- else
- setregs_adv(0x43 + regnum, 0xc0, (c->volcar ^ 0x3f) & 0x3f);
- } else {
- c->trcwait--;
- if(allvolume != 0)
- setregs_adv(0x43 + regnum, 0xc0, ((((c->volcar & 0x3f) * allvolume) >> 8) ^ 0x3f) & 0x3f);
- }
- }
-
- return (!playing || songlooped) ? false : true;
-}
-
-void CldsPlayer::rewind(int subsong)
-{
- int i;
-
- // init all with 0
- tempo_now = 3; playing = true; songlooped = false;
- jumping = fadeonoff = allvolume = hardfade = pattplay = posplay = jumppos =
- mainvolume = 0;
- memset(channel, 0, sizeof(channel));
- memset(fmchip, 0, sizeof(fmchip));
-
- // OPL2 init
- opl->init(); // Reset OPL chip
- opl->write(1, 0x20);
- opl->write(8, 0);
- opl->write(0xbd, regbd);
-
- for(i = 0; i < 9; i++) {
- opl->write(0x20 + op_table[i], 0);
- opl->write(0x23 + op_table[i], 0);
- opl->write(0x40 + op_table[i], 0x3f);
- opl->write(0x43 + op_table[i], 0x3f);
- opl->write(0x60 + op_table[i], 0xff);
- opl->write(0x63 + op_table[i], 0xff);
- opl->write(0x80 + op_table[i], 0xff);
- opl->write(0x83 + op_table[i], 0xff);
- opl->write(0xe0 + op_table[i], 0);
- opl->write(0xe3 + op_table[i], 0);
- opl->write(0xa0 + i, 0);
- opl->write(0xb0 + i, 0);
- opl->write(0xc0 + i, 0);
- }
-}
-
-/*** private methods *************************************/
-
-void CldsPlayer::playsound(int inst_number, int channel_number, int tunehigh)
-{
- Channel *c = &channel[channel_number]; // current channel
- SoundBank *i = &soundbank[inst_number]; // current instrument
- unsigned int regnum = op_table[channel_number]; // channel's OPL2 register
- unsigned char volcalc, octave;
- unsigned short freq;
-
- // set fine tune
- tunehigh += ((i->finetune + c->finetune + 0x80) & 0xff) - 0x80;
-
- // arpeggio handling
- if(!i->arpeggio) {
- unsigned short arpcalc = i->arp_tab[0] << 4;
-
- if(arpcalc > 0x800)
- tunehigh = tunehigh - (arpcalc ^ 0xff0) - 16;
- else
- tunehigh += arpcalc;
- }
-
- // glide handling
- if(c->glideto != 0) {
- c->gototune = tunehigh;
- c->portspeed = c->glideto;
- c->glideto = c->finetune = 0;
- return;
- }
-
- // set modulator registers
- setregs(0x20 + regnum, i->mod_misc);
- volcalc = i->mod_vol;
- if(!c->nextvol || !(i->feedback & 1))
- c->volmod = volcalc;
- else
- c->volmod = (volcalc & 0xc0) | ((((volcalc & 0x3f) * c->nextvol) >> 6));
-
- if((i->feedback & 1) == 1 && allvolume != 0)
- setregs(0x40 + regnum, ((c->volmod & 0xc0) | (((c->volmod & 0x3f) * allvolume) >> 8)) ^ 0x3f);
- else
- setregs(0x40 + regnum, c->volmod ^ 0x3f);
- setregs(0x60 + regnum, i->mod_ad);
- setregs(0x80 + regnum, i->mod_sr);
- setregs(0xe0 + regnum, i->mod_wave);
-
- // Set carrier registers
- setregs(0x23 + regnum, i->car_misc);
- volcalc = i->car_vol;
- if(!c->nextvol)
- c->volcar = volcalc;
- else
- c->volcar = (volcalc & 0xc0) | ((((volcalc & 0x3f) * c->nextvol) >> 6));
-
- if(allvolume)
- setregs(0x43 + regnum, ((c->volcar & 0xc0) | (((c->volcar & 0x3f) * allvolume) >> 8)) ^ 0x3f);
- else
- setregs(0x43 + regnum, c->volcar ^ 0x3f);
- setregs(0x63 + regnum, i->car_ad);
- setregs(0x83 + regnum, i->car_sr);
- setregs(0xe3 + regnum, i->car_wave);
- setregs(0xc0 + channel_number, i->feedback);
- setregs_adv(0xb0 + channel_number, 0xdf, 0); // key off
-
- freq = frequency[tunehigh % (12 * 16)];
- octave = tunehigh / (12 * 16) - 1;
- if(!i->glide) {
- if(!i->portamento || !c->lasttune) {
- setregs(0xa0 + channel_number, freq & 0xff);
- setregs(0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8));
- c->lasttune = c->gototune = tunehigh;
- } else {
- c->gototune = tunehigh;
- c->portspeed = i->portamento;
- setregs_adv(0xb0 + channel_number, 0xdf, 0x20); // key on
- }
- } else {
- setregs(0xa0 + channel_number, freq & 0xff);
- setregs(0xb0 + channel_number, (octave << 2) + 0x20 + (freq >> 8));
- c->lasttune = tunehigh;
- c->gototune = tunehigh + ((i->glide + 0x80) & 0xff) - 0x80; // set destination
- c->portspeed = i->portamento;
- }
-
- if(!i->vibrato)
- c->vibwait = c->vibspeed = c->vibrate = 0;
- else {
- c->vibwait = i->vibdelay;
- // PASCAL: c->vibspeed = ((i->vibrato >> 4) & 15) + 1;
- c->vibspeed = (i->vibrato >> 4) + 2;
- c->vibrate = (i->vibrato & 15) + 1;
- }
-
- if(!(c->trmstay & 0xf0)) {
- c->trmwait = (i->tremwait & 0xf0) >> 3;
- // PASCAL: c->trmspeed = (i->mod_trem >> 4) & 15;
- c->trmspeed = i->mod_trem >> 4;
- c->trmrate = i->mod_trem & 15;
- c->trmcount = 0;
- }
-
- if(!(c->trmstay & 0x0f)) {
- c->trcwait = (i->tremwait & 15) << 1;
- // PASCAL: c->trcspeed = (i->car_trem >> 4) & 15;
- c->trcspeed = i->car_trem >> 4;
- c->trcrate = i->car_trem & 15;
- c->trccount = 0;
- }
-
- c->arp_size = i->arpeggio & 15;
- c->arp_speed = i->arpeggio >> 4;
- memcpy(c->arp_tab, i->arp_tab, 12);
- c->keycount = i->keyoff;
- c->nextvol = c->glideto = c->finetune = c->vibcount = c->arp_pos = c->arp_count = 0;
-}
-
-inline void CldsPlayer::setregs(unsigned char reg, unsigned char val)
-{
- if(fmchip[reg] == val) return;
-
- fmchip[reg] = val;
- opl->write(reg, val);
-}
-
-inline void CldsPlayer::setregs_adv(unsigned char reg, unsigned char mask,
- unsigned char val)
-{
- setregs(reg, (fmchip[reg] & mask) | val);
-}
diff --git a/src/adplug/core/lds.h b/src/adplug/core/lds.h
deleted file mode 100644
index 97f06c1..0000000
--- a/src/adplug/core/lds.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * lds.h - LOUDNESS Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CldsPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl) { return new CldsPlayer(newopl); }
-
- CldsPlayer(Copl *newopl);
- virtual ~CldsPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- virtual bool update();
- virtual void rewind(int subsong = -1);
- float getrefresh() { return 70.0f; }
-
- std::string gettype() { return std::string("LOUDNESS Sound System"); }
- unsigned int getorders() { return numposi; }
- unsigned int getorder() { return posplay; }
- unsigned int getrow() { return pattplay; }
- unsigned int getspeed() { return speed; }
- unsigned int getinstruments() { return numpatch; }
-
- private:
- typedef struct {
- unsigned char mod_misc, mod_vol, mod_ad, mod_sr, mod_wave,
- car_misc, car_vol, car_ad, car_sr, car_wave, feedback, keyoff,
- portamento, glide, finetune, vibrato, vibdelay, mod_trem, car_trem,
- tremwait, arpeggio, arp_tab[12];
- unsigned short start, size;
- unsigned char fms;
- unsigned short transp;
- unsigned char midinst, midvelo, midkey, midtrans, middum1, middum2;
- } SoundBank;
-
- typedef struct {
- unsigned short gototune, lasttune, packpos;
- unsigned char finetune, glideto, portspeed, nextvol, volmod, volcar,
- vibwait, vibspeed, vibrate, trmstay, trmwait, trmspeed, trmrate, trmcount,
- trcwait, trcspeed, trcrate, trccount, arp_size, arp_speed, keycount,
- vibcount, arp_pos, arp_count, packwait, arp_tab[12];
-
- struct {
- unsigned char chandelay, sound;
- unsigned short high;
- } chancheat;
- } Channel;
-
- typedef struct {
- unsigned short patnum;
- unsigned char transpose;
- } Position;
-
- static const unsigned short frequency[];
- static const unsigned char vibtab[], tremtab[];
- static const unsigned short maxsound, maxpos;
-
- SoundBank *soundbank;
- Channel channel[9];
- Position *positions;
- unsigned char fmchip[0xff], jumping, fadeonoff, allvolume, hardfade,
- tempo_now, pattplay, tempo, regbd, chandelay[9], mode, pattlen;
- unsigned short posplay, jumppos, *patterns, speed;
- bool playing, songlooped;
- unsigned int numpatch, numposi, mainvolume;
-
- void playsound(int inst_number, int channel_number, int tunehigh);
- inline void setregs(unsigned char reg, unsigned char val);
- inline void setregs_adv(unsigned char reg, unsigned char mask,
- unsigned char val);
-};
diff --git a/src/adplug/core/mad.cc b/src/adplug/core/mad.cc
deleted file mode 100644
index 17d93e3..0000000
--- a/src/adplug/core/mad.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- mad.cpp - MAD loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include <cstring>
-#include "mad.h"
-
-/* -------- Public Methods -------------------------------- */
-
-CPlayer *CmadLoader::factory(Copl *newopl)
-{
- return new CmadLoader(newopl);
-}
-
-bool CmadLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- const unsigned char conv_inst[10] = { 2,1,10,9,4,3,6,5,8,7 };
- unsigned int i, j, k, t = 0;
-
- // 'MAD+' - signed ?
- char id[4]; f->readString(id, 4);
- if (strncmp(id,"MAD+",4)) { fp.close(f); return false; }
-
- // load instruments
- for(i = 0; i < 9; i++) {
- f->readString(instruments[i].name, 8);
- for(j = 0; j < 12; j++) instruments[i].data[j] = f->readInt(1);
- }
-
- f->ignore(1);
-
- // data for Protracker
- length = f->readInt(1); nop = f->readInt(1); timer = f->readInt(1);
-
- // init CmodPlayer
- realloc_instruments(9);
- realloc_order(length);
- realloc_patterns(nop,32,9);
- init_trackord();
-
- // load tracks
- for(i = 0; i < nop; i++)
- for(k = 0; k < 32; k++)
- for(j = 0; j < 9; j++) {
- t = i * 9 + j;
-
- // read event
- unsigned char event = f->readInt(1);
-
- // convert event
- if (event < 0x61)
- tracks[t][k].note = event;
- if (event == 0xFF) // 0xFF: Release note
- tracks[t][k].command = 8;
- if (event == 0xFE) // 0xFE: Pattern Break
- tracks[t][k].command = 13;
- }
-
- // load order
- for(i = 0; i < length; i++) order[i] = f->readInt(1) - 1;
-
- fp.close(f);
-
- // convert instruments
- for(i = 0; i < 9; i++)
- for(j = 0; j < 10; j++)
- inst[i].data[conv_inst[j]] = instruments[i].data[j];
-
- // data for Protracker
- restartpos = 0;
- initspeed = 1;
-
- rewind(0);
- return true;
-}
-
-void CmadLoader::rewind(int subsong)
-{
- CmodPlayer::rewind(subsong);
-
- // default instruments
- for (int i=0;i<9;i++)
- {
- channel[i].inst = i;
-
- channel[i].vol1 = 63 - (inst[i].data[10] & 63);
- channel[i].vol2 = 63 - (inst[i].data[9] & 63);
- }
-}
-
-float CmadLoader::getrefresh()
-{
- return (float)timer;
-}
-
-std::string CmadLoader::gettype()
-{
- return std::string("Mlat Adlib Tracker");
-}
-
-std::string CmadLoader::getinstrument(unsigned int n)
-{
- return std::string(instruments[n].name,8);
-}
-
-unsigned int CmadLoader::getinstruments()
-{
- return 9;
-}
diff --git a/src/adplug/core/mad.h b/src/adplug/core/mad.h
deleted file mode 100644
index 061685d..0000000
--- a/src/adplug/core/mad.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- mad.h - MAD loader by Riven the Mage <riven@ok.ru>
-*/
-
-#include "protrack.h"
-
-class CmadLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CmadLoader(Copl *newopl) : CmodPlayer(newopl) { };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string getinstrument(unsigned int n);
- unsigned int getinstruments();
-
-private:
-
- struct mad_instrument
- {
- char name[8];
- unsigned char data[12]; // last two unused
- } instruments[9];
-
- unsigned char timer;
-};
diff --git a/src/adplug/core/mid.cc b/src/adplug/core/mid.cc
deleted file mode 100644
index 9ff191f..0000000
--- a/src/adplug/core/mid.cc
+++ /dev/null
@@ -1,1110 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *
- * MIDI & MIDI-like file player - Last Update: 10/15/2005
- * by Phil Hassey - www.imitationpickles.org
- * philhassey@hotmail.com
- *
- * Can play the following
- * .LAA - a raw save of a Lucas Arts Adlib music
- * or
- * a raw save of a LucasFilm Adlib music
- * .MID - a "midi" save of a Lucas Arts Adlib music
- * - or general MIDI files
- * .CMF - Creative Music Format
- * .SCI - the sierra "midi" format.
- * Files must be in the form
- * xxxNAME.sci
- * So that the loader can load the right patch file:
- * xxxPATCH.003 (patch.003 must be saved from the
- * sierra resource from each game.)
- *
- * 6/2/2000: v1.0 relased by phil hassey
- * Status: LAA is almost perfect
- * - some volumes are a bit off (intrument too quiet)
- * MID is fine (who wants to listen to MIDI vid adlib anyway)
- * CMF is okay (still needs the adlib rythm mode implemented
- * for real)
- * 6/6/2000:
- * Status: SCI: there are two SCI formats, orginal and advanced.
- * original: (Found in SCI/EGA Sierra Adventures)
- * played almost perfectly, I believe
- * there is one mistake in the instrument
- * loader that causes some sounds to
- * not be quite right. Most sounds are fine.
- * advanced: (Found in SCI/VGA Sierra Adventures)
- * These are multi-track files. (Thus the
- * player had to be modified to work with
- * them.) This works fine.
- * There are also multiple tunes in each file.
- * I think some of them are supposed to be
- * played at the same time, but I'm not sure
- * when.
- * 8/16/2000:
- * Status: LAA: now EGA and VGA lucas games work pretty well
- *
- * 10/15/2005: Changes by Simon Peter
- * Added rhythm mode support for CMF format.
- *
- * 09/13/2008: Changes by Adam Nielsen (malvineous@shikadi.net)
- * Fixed a couple of CMF rhythm mode bugs
- * Disabled note velocity for CMF files
- * Added support for nonstandard CMF AM+VIB controller (for VGFM CMFs)
- *
- * Other acknowledgements:
- * Allegro - for the midi instruments and the midi volume table
- * SCUMM Revisited - for getting the .LAA / .MIDs out of those
- * LucasArts files.
- * FreeSCI - for some information on the sci music files
- * SD - the SCI Decoder (to get all .sci out of the Sierra files)
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-#include <string.h>
-#include "mid.h"
-#include "mididata.h"
-
-/*#define TESTING*/
-#ifdef TESTING
-#define midiprintf printf
-#else
-void CmidPlayer::midiprintf(const char *format, ...)
- {
- }
-#endif
-
-#define LUCAS_STYLE 1
-#define CMF_STYLE 2
-#define MIDI_STYLE 4
-#define SIERRA_STYLE 8
-
-// AdLib melodic and rhythm mode defines
-#define ADLIB_MELODIC 0
-#define ADLIB_RYTHM 1
-
-// File types
-#define FILE_LUCAS 1
-#define FILE_MIDI 2
-#define FILE_CMF 3
-#define FILE_SIERRA 4
-#define FILE_ADVSIERRA 5
-#define FILE_OLDLUCAS 6
-
-// AdLib standard operator table
-const unsigned char CmidPlayer::adlib_opadd[] = {0x00 ,0x01 ,0x02 ,0x08 ,0x09 ,0x0A ,0x10 ,0x11 ,0x12};
-
-// map CMF drum channels 12 - 15 to corresponding AdLib drum operators
-// bass drum (channel 11) not mapped, cause it's handled like a normal instrument
-const int CmidPlayer::map_chan[] = { 0x14, 0x12, 0x15, 0x11 };
-
-// Standard AdLib frequency table
-const int CmidPlayer::fnums[] = { 0x16b,0x181,0x198,0x1b0,0x1ca,0x1e5,0x202,0x220,0x241,0x263,0x287,0x2ae };
-
-// Map CMF drum channels 11 - 15 to corresponding AdLib drum channels
-const int CmidPlayer::percussion_map[] = { 6, 7, 8, 8, 7 };
-
-CPlayer *CmidPlayer::factory(Copl *newopl)
-{
- return new CmidPlayer(newopl);
-}
-
-CmidPlayer::CmidPlayer(Copl *newopl)
- : CPlayer(newopl), author(&emptystr), title(&emptystr), remarks(&emptystr),
- emptystr('\0'), flen(0), data(0)
-{
-}
-
-unsigned char CmidPlayer::datalook(long pos)
-{
- if (pos<0 || pos >= flen) return(0);
- return(data[pos]);
-}
-
-unsigned long CmidPlayer::getnexti(unsigned long num)
-{
- unsigned long v=0;
- unsigned long i;
-
- for (i=0; i<num; i++)
- {
- v+=(datalook(pos)<<(8*i)); pos++;
- }
- return(v);
-}
-
-unsigned long CmidPlayer::getnext(unsigned long num)
-{
- unsigned long v=0;
- unsigned long i;
-
- for (i=0; i<num; i++)
- {
- v<<=8;
- v+=datalook(pos); pos++;
- }
- return(v);
-}
-
-unsigned long CmidPlayer::getval()
-{
- int v=0;
- unsigned char b;
-
- b=(unsigned char)getnext(1);
- v=b&0x7f;
- while ((b&0x80) !=0)
- {
- b=(unsigned char)getnext(1);
- v = (v << 7) + (b & 0x7F);
- }
- return(v);
-}
-
-bool CmidPlayer::load_sierra_ins(const std::string &fname, const CFileProvider &fp)
-{
- long i,j,k,l;
- unsigned char ins[28];
- char *pfilename;
- binistream *f;
-
- pfilename = (char *)malloc(fname.length()+9);
- strcpy(pfilename,fname.c_str());
- j=0;
- for(i=strlen(pfilename)-1; i >= 0; i--)
- if(pfilename[i] == '/' || pfilename[i] == '\\') {
- j = i+1;
- break;
- }
- sprintf(pfilename+j+3,"patch.003");
-
- f = fp.open(pfilename);
- free(pfilename);
- if(!f) return false;
-
- f->ignore(2);
- stins = 0;
- for (i=0; i<2; i++)
- {
- for (k=0; k<48; k++)
- {
- l=i*48+k;
- midiprintf ("\n%2ld: ",l);
- for (j=0; j<28; j++)
- ins[j] = f->readInt(1);
-
- myinsbank[l][0]=
- (ins[9]*0x80) + (ins[10]*0x40) +
- (ins[5]*0x20) + (ins[11]*0x10) +
- ins[1]; //1=ins5
- myinsbank[l][1]=
- (ins[22]*0x80) + (ins[23]*0x40) +
- (ins[18]*0x20) + (ins[24]*0x10) +
- ins[14]; //1=ins18
-
- myinsbank[l][2]=(ins[0]<<6)+ins[8];
- myinsbank[l][3]=(ins[13]<<6)+ins[21];
-
- myinsbank[l][4]=(ins[3]<<4)+ins[6];
- myinsbank[l][5]=(ins[16]<<4)+ins[19];
- myinsbank[l][6]=(ins[4]<<4)+ins[7];
- myinsbank[l][7]=(ins[17]<<4)+ins[20];
-
- myinsbank[l][8]=ins[26];
- myinsbank[l][9]=ins[27];
-
- myinsbank[l][10]=((ins[2]<<1))+(1-(ins[12]&1));
- //(ins[12] ? 0:1)+((ins[2]<<1));
-
- for (j=0; j<11; j++)
- midiprintf ("%02X ",myinsbank[l][j]);
- stins++;
- }
- f->ignore(2);
- }
-
- fp.close(f);
- memcpy(smyinsbank, myinsbank, 128 * 16);
- return true;
-}
-
-void CmidPlayer::sierra_next_section()
-{
- int i,j;
-
- for (i=0; i<16; i++)
- track[i].on=0;
-
- midiprintf("\n\nnext adv sierra section:\n");
-
- pos=sierra_pos;
- i=0;j=0;
- while (i!=0xff)
- {
- getnext(1);
- curtrack=j; j++;
- track[curtrack].on=1;
- track[curtrack].spos = getnext(1);
- track[curtrack].spos += (getnext(1) << 8) + 4; //4 best usually +3? not 0,1,2 or 5
-// track[curtrack].spos=getnext(1)+(getnext(1)<<8)+4; // dynamite!: doesn't optimize correctly!!
- track[curtrack].tend=flen; //0xFC will kill it
- track[curtrack].iwait=0;
- track[curtrack].pv=0;
- midiprintf ("track %u starts at %lx\n",curtrack,track[curtrack].spos);
-
- getnext(2);
- i=getnext(1);
- }
- getnext(2);
- deltas=0x20;
- sierra_pos=pos;
- //getch();
-
- fwait=0;
- doing=1;
-}
-
-bool CmidPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- int good;
- unsigned char s[6];
-
- f->readString((char *)s, 6);
- good=0;
- subsongs=0;
- switch(s[0])
- {
- case 'A':
- if (s[1]=='D' && s[2]=='L') good=FILE_LUCAS;
- break;
- case 'M':
- if (s[1]=='T' && s[2]=='h' && s[3]=='d') good=FILE_MIDI;
- break;
- case 'C':
- if (s[1]=='T' && s[2]=='M' && s[3]=='F') good=FILE_CMF;
- break;
- case 0x84:
- if (s[1]==0x00 && load_sierra_ins(filename, fp)) {
- if (s[2]==0xf0)
- good=FILE_ADVSIERRA;
- else
- good=FILE_SIERRA;
- }
- break;
- default:
- if (s[4]=='A' && s[5]=='D') good=FILE_OLDLUCAS;
- break;
- }
-
- if (good!=0)
- subsongs=1;
- else {
- fp.close(f);
- return false;
- }
-
- type=good;
- f->seek(0);
- flen = fp.filesize(f);
- data = new unsigned char [flen];
- f->readString((char *)data, flen);
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-void CmidPlayer::midi_write_adlib(unsigned int r, unsigned char v)
-{
- opl->write(r,v);
- adlib_data[r]=v;
-}
-
-void CmidPlayer::midi_fm_instrument(int voice, unsigned char *inst)
-{
- if ((adlib_style&SIERRA_STYLE)!=0)
- midi_write_adlib(0xbd,0); //just gotta make sure this happens..
- //'cause who knows when it'll be
- //reset otherwise.
-
-
- midi_write_adlib(0x20+adlib_opadd[voice],inst[0]);
- midi_write_adlib(0x23+adlib_opadd[voice],inst[1]);
-
- if (adlib_style & LUCAS_STYLE) {
- midi_write_adlib(0x43+adlib_opadd[voice],0x3f);
- if ((inst[10] & 1)==0)
- midi_write_adlib(0x40+adlib_opadd[voice],inst[2]);
- else
- midi_write_adlib(0x40+adlib_opadd[voice],0x3f);
-
- } else if ((adlib_style & SIERRA_STYLE) || (adlib_style & CMF_STYLE)) {
- midi_write_adlib(0x40+adlib_opadd[voice],inst[2]);
- midi_write_adlib(0x43+adlib_opadd[voice],inst[3]);
-
- } else {
- midi_write_adlib(0x40+adlib_opadd[voice],inst[2]);
- if ((inst[10] & 1)==0)
- midi_write_adlib(0x43+adlib_opadd[voice],inst[3]);
- else
- midi_write_adlib(0x43+adlib_opadd[voice],0);
- }
-
- midi_write_adlib(0x60+adlib_opadd[voice],inst[4]);
- midi_write_adlib(0x63+adlib_opadd[voice],inst[5]);
- midi_write_adlib(0x80+adlib_opadd[voice],inst[6]);
- midi_write_adlib(0x83+adlib_opadd[voice],inst[7]);
- midi_write_adlib(0xe0+adlib_opadd[voice],inst[8]);
- midi_write_adlib(0xe3+adlib_opadd[voice],inst[9]);
-
- midi_write_adlib(0xc0+voice,inst[10]);
-}
-
-void CmidPlayer::midi_fm_percussion(int ch, unsigned char *inst)
-{
- int opadd = map_chan[ch - 12];
-
- midi_write_adlib(0x20 + opadd, inst[0]);
- midi_write_adlib(0x40 + opadd, inst[2]);
- midi_write_adlib(0x60 + opadd, inst[4]);
- midi_write_adlib(0x80 + opadd, inst[6]);
- midi_write_adlib(0xe0 + opadd, inst[8]);
- if (opadd < 0x13) // only output this for the modulator, not the carrier, as it affects the entire channel
- midi_write_adlib(0xc0 + percussion_map[ch - 11], inst[10]);
-}
-
-void CmidPlayer::midi_fm_volume(int voice, int volume)
-{
- int vol;
-
- if ((adlib_style&SIERRA_STYLE)==0) //sierra likes it loud!
- {
- vol=volume>>2;
-
- if ((adlib_style&LUCAS_STYLE)!=0)
- {
- if ((adlib_data[0xc0+voice]&1)==1)
- midi_write_adlib(0x40+adlib_opadd[voice], (unsigned char)((63-vol) |
- (adlib_data[0x40+adlib_opadd[voice]]&0xc0)));
- midi_write_adlib(0x43+adlib_opadd[voice], (unsigned char)((63-vol) |
- (adlib_data[0x43+adlib_opadd[voice]]&0xc0)));
- }
- else
- {
- if ((adlib_data[0xc0+voice]&1)==1)
- midi_write_adlib(0x40+adlib_opadd[voice], (unsigned char)((63-vol) |
- (adlib_data[0x40+adlib_opadd[voice]]&0xc0)));
- midi_write_adlib(0x43+adlib_opadd[voice], (unsigned char)((63-vol) |
- (adlib_data[0x43+adlib_opadd[voice]]&0xc0)));
- }
- }
-}
-
-void CmidPlayer::midi_fm_playnote(int voice, int note, int volume)
-{
- int freq=fnums[note%12];
- int oct=note/12;
- int c;
-
- midi_fm_volume(voice,volume);
- midi_write_adlib(0xa0+voice,(unsigned char)(freq&0xff));
-
- c=((freq&0x300) >> 8)+((oct&7)<<2) + (adlib_mode == ADLIB_MELODIC || voice < 6 ? (1<<5) : 0);
- midi_write_adlib(0xb0+voice,(unsigned char)c);
-}
-
-void CmidPlayer::midi_fm_endnote(int voice)
-{
- //midi_fm_volume(voice,0);
- //midi_write_adlib(0xb0+voice,0);
-
- midi_write_adlib(0xb0+voice,(unsigned char)(adlib_data[0xb0+voice]&(255-32)));
-}
-
-void CmidPlayer::midi_fm_reset()
-{
- int i;
-
- opl->init();
-
- for (i=0; i<256; i++)
- midi_write_adlib(i,0);
-
- midi_write_adlib(0x01, 0x20);
- midi_write_adlib(0xBD,0xc0);
-}
-
-bool CmidPlayer::update()
-{
- long w,v,note,vel,ctrl,nv,x,l,lnum;
- int i=0,j,c;
- int on,onl,numchan;
- int ret;
-
- if (doing == 1)
- {
- // just get the first wait and ignore it :>
- for (curtrack=0; curtrack<16; curtrack++)
- if (track[curtrack].on)
- {
- pos=track[curtrack].pos;
- if (type != FILE_SIERRA && type !=FILE_ADVSIERRA)
- track[curtrack].iwait+=getval();
- else
- track[curtrack].iwait+=getnext(1);
- track[curtrack].pos=pos;
- }
- doing=0;
- }
-
- iwait=0;
- ret=1;
-
- while (iwait==0 && ret==1)
- {
- for (curtrack=0; curtrack<16; curtrack++)
- if (track[curtrack].on && track[curtrack].iwait==0 &&
- track[curtrack].pos < track[curtrack].tend)
- {
- pos=track[curtrack].pos;
-
- v=getnext(1);
-
- // This is to do implied MIDI events.
- if (v<0x80) {v=track[curtrack].pv; pos--;}
- track[curtrack].pv=(unsigned char)v;
-
- c=v&0x0f;
- midiprintf ("[%2lX]",v);
- switch(v&0xf0)
- {
- case 0x80: /*note off*/
- note=getnext(1); vel=getnext(1);
- for (i=0; i<9; i++)
- if (chp[i][0]==c && chp[i][1]==note)
- {
- midi_fm_endnote(i);
- chp[i][0]=-1;
- }
- break;
- case 0x90: /*note on*/
- // doing=0;
- note=getnext(1); vel=getnext(1);
-
- if(adlib_mode == ADLIB_RYTHM)
- numchan = 6;
- else
- numchan = 9;
-
- if (ch[c].on!=0)
- {
- for (i=0; i<18; i++)
- chp[i][2]++;
-
- if(c < 11 || adlib_mode == ADLIB_MELODIC) {
- j=0;
- on=-1;onl=0;
- for (i=0; i<numchan; i++)
- if (chp[i][0]==-1 && chp[i][2]>onl)
- { onl=chp[i][2]; on=i; j=1; }
-
- if (on==-1)
- {
- onl=0;
- for (i=0; i<numchan; i++)
- if (chp[i][2]>onl)
- { onl=chp[i][2]; on=i; }
- }
-
- if (j==0)
- midi_fm_endnote(on);
- } else
- on = percussion_map[c - 11];
-
- if (vel!=0 && ch[c].inum>=0 && ch[c].inum<128) {
- if (adlib_mode == ADLIB_MELODIC || c < 12) // 11 == bass drum, handled like a normal instrument, on == channel 6 thanks to percussion_map[] above
- midi_fm_instrument(on,ch[c].ins);
- else
- midi_fm_percussion(c, ch[c].ins);
-
- if (adlib_style & MIDI_STYLE) {
- nv=((ch[c].vol*vel)/128);
- if ((adlib_style&LUCAS_STYLE)!=0) nv*=2;
- if (nv>127) nv=127;
- nv=my_midi_fm_vol_table[nv];
- if ((adlib_style&LUCAS_STYLE)!=0)
- nv=(int)((float)sqrt((float)nv)*11);
- } else if (adlib_style & CMF_STYLE) {
- // CMF doesn't support note velocity (even though some files have them!)
- nv = 127;
- } else {
- nv=vel;
- }
-
- midi_fm_playnote(on,note+ch[c].nshift,nv*2); // sets freq in rhythm mode
- chp[on][0]=c;
- chp[on][1]=note;
- chp[on][2]=0;
-
- if(adlib_mode == ADLIB_RYTHM && c >= 11) {
- // Still need to turn off the perc instrument before playing it again,
- // as not all songs send a noteoff.
- midi_write_adlib(0xbd, adlib_data[0xbd] & ~(0x10 >> (c - 11)));
- // Play the perc instrument
- midi_write_adlib(0xbd, adlib_data[0xbd] | (0x10 >> (c - 11)));
- }
-
- } else {
- if (vel==0) { //same code as end note
- if (adlib_mode == ADLIB_RYTHM && c >= 11) {
- // Turn off the percussion instrument
- midi_write_adlib(0xbd, adlib_data[0xbd] & ~(0x10 >> (c - 11)));
- //midi_fm_endnote(percussion_map[c]);
- chp[percussion_map[c - 11]][0]=-1;
- } else {
- for (i=0; i<9; i++) {
- if (chp[i][0]==c && chp[i][1]==note) {
- // midi_fm_volume(i,0); // really end the note
- midi_fm_endnote(i);
- chp[i][0]=-1;
- }
- }
- }
- } else {
- // i forget what this is for.
- chp[on][0]=-1;
- chp[on][2]=0;
- }
- }
- midiprintf(" [%d:%d:%ld:%ld]\n",c,ch[c].inum,note,vel);
- }
- else
- midiprintf ("off");
- break;
- case 0xa0: /*key after touch */
- note=getnext(1); vel=getnext(1);
- /* //this might all be good
- for (i=0; i<9; i++)
- if (chp[i][0]==c & chp[i][1]==note)
-
-midi_fm_playnote(i,note+cnote[c],my_midi_fm_vol_table[(cvols[c]*vel)/128]*2);
- */
- break;
- case 0xb0: /*control change .. pitch bend? */
- ctrl=getnext(1); vel=getnext(1);
-
- switch(ctrl)
- {
- case 0x07:
- midiprintf ("(pb:%d: %ld %ld)",c,ctrl,vel);
- ch[c].vol=vel;
- midiprintf("vol");
- break;
- case 0x63:
- if (adlib_style & CMF_STYLE) {
- // Custom extension to allow CMF files to switch the
- // AM+VIB depth on and off (officially this is on,
- // and there's no way to switch it off.) Controller
- // values:
- // 0 == AM+VIB off
- // 1 == VIB on
- // 2 == AM on
- // 3 == AM+VIB on
- midi_write_adlib(0xbd, (adlib_data[0xbd] & ~0xC0) | (vel << 6));
- midiprintf(" AM+VIB depth change - AM %s, VIB %s\n",
- (adlib_data[0xbd] & 0x80) ? "on" : "off",
- (adlib_data[0xbd] & 0x40) ? "on" : "off"
- );
- }
- break;
- case 0x67:
- midiprintf("Rhythm mode: %ld\n", vel);
- if ((adlib_style&CMF_STYLE)!=0) {
- adlib_mode=vel;
- if(adlib_mode == ADLIB_RYTHM)
- midi_write_adlib(0xbd, adlib_data[0xbd] | (1 << 5));
- else
- midi_write_adlib(0xbd, adlib_data[0xbd] & ~(1 << 5));
- }
- break;
- }
- break;
- case 0xc0: /*patch change*/
- x=getnext(1);
- ch[c].inum=x;
- for (j=0; j<11; j++)
- ch[c].ins[j]=myinsbank[ch[c].inum][j];
- break;
- case 0xd0: /*chanel touch*/
- x=getnext(1);
- break;
- case 0xe0: /*pitch wheel*/
- x=getnext(1);
- x=getnext(1);
- break;
- case 0xf0:
- switch(v)
- {
- case 0xf0:
- case 0xf7: /*sysex*/
- l=getval();
- if (datalook(pos+l)==0xf7)
- i=1;
- midiprintf("{%ld}",l);
- midiprintf("\n");
-
- if (datalook(pos)==0x7d &&
- datalook(pos+1)==0x10 &&
- datalook(pos+2)<16)
- {
- adlib_style=LUCAS_STYLE|MIDI_STYLE;
- for (i=0; i<l; i++)
- {
- midiprintf ("%x ",datalook(pos+i));
- if ((i-3)%10 == 0) midiprintf("\n");
- }
- midiprintf ("\n");
- getnext(1);
- getnext(1);
- c=getnext(1);
- getnext(1);
-
- // getnext(22); //temp
- ch[c].ins[0]=(unsigned char)((getnext(1)<<4)+getnext(1));
- ch[c].ins[2]=(unsigned char)(0xff-(((getnext(1)<<4)+getnext(1))&0x3f));
- ch[c].ins[4]=(unsigned char)(0xff-((getnext(1)<<4)+getnext(1)));
- ch[c].ins[6]=(unsigned char)(0xff-((getnext(1)<<4)+getnext(1)));
- ch[c].ins[8]=(unsigned char)((getnext(1)<<4)+getnext(1));
-
- ch[c].ins[1]=(unsigned char)((getnext(1)<<4)+getnext(1));
- ch[c].ins[3]=(unsigned char)(0xff-(((getnext(1)<<4)+getnext(1))&0x3f));
- ch[c].ins[5]=(unsigned char)(0xff-((getnext(1)<<4)+getnext(1)));
- ch[c].ins[7]=(unsigned char)(0xff-((getnext(1)<<4)+getnext(1)));
- ch[c].ins[9]=(unsigned char)((getnext(1)<<4)+getnext(1));
-
- i=(getnext(1)<<4)+getnext(1);
- ch[c].ins[10]=i;
-
- //if ((i&1)==1) ch[c].ins[10]=1;
-
- midiprintf ("\n%d: ",c);
- for (i=0; i<11; i++)
- midiprintf ("%2X ",ch[c].ins[i]);
- getnext(l-26);
- }
- else
- {
- midiprintf("\n");
- for (j=0; j<l; j++)
- midiprintf ("%2lX ",getnext(1));
- }
-
- midiprintf("\n");
- if(i==1)
- getnext(1);
- break;
- case 0xf1:
- break;
- case 0xf2:
- getnext(2);
- break;
- case 0xf3:
- getnext(1);
- break;
- case 0xf4:
- break;
- case 0xf5:
- break;
- case 0xf6: /*something*/
- case 0xf8:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- //this ends the track for sierra.
- if (type == FILE_SIERRA ||
- type == FILE_ADVSIERRA)
- {
- track[curtrack].tend=pos;
- midiprintf ("endmark: %lu -- %lx\n",pos,pos);
- }
- break;
- case 0xfe:
- break;
- case 0xfd:
- break;
- case 0xff:
- v=getnext(1);
- l=getval();
- midiprintf ("\n");
- midiprintf("{%lX_%lX}",v,l);
- if (v==0x51)
- {
- lnum=getnext(l);
- msqtr=lnum; /*set tempo*/
- midiprintf ("(qtr=%ld)",msqtr);
- }
- else
- {
- for (i=0; i<l; i++)
- midiprintf ("%2lX ",getnext(1));
- }
- break;
- }
- break;
- default: midiprintf("%lX!",v); /* if we get down here, a error occurred */
- break;
- }
-
- if (pos < track[curtrack].tend)
- {
- if (type != FILE_SIERRA && type !=FILE_ADVSIERRA)
- w=getval();
- else
- w=getnext(1);
- track[curtrack].iwait=w;
- /*
- if (w!=0)
- {
- midiprintf("\n<%d>",w);
- f =
-((float)w/(float)deltas)*((float)msqtr/(float)1000000);
- if (doing==1) f=0; //not playing yet. don't wait yet
- }
- */
- }
- else
- track[curtrack].iwait=0;
-
- track[curtrack].pos=pos;
- }
-
-
- ret=0; //end of song.
- iwait=0;
- for (curtrack=0; curtrack<16; curtrack++)
- if (track[curtrack].on == 1 &&
- track[curtrack].pos < track[curtrack].tend)
- ret=1; //not yet..
-
- if (ret==1)
- {
- iwait=0xffffff; // bigger than any wait can be!
- for (curtrack=0; curtrack<16; curtrack++)
- if (track[curtrack].on == 1 &&
- track[curtrack].pos < track[curtrack].tend &&
- track[curtrack].iwait < iwait)
- iwait=track[curtrack].iwait;
- }
- }
-
-
- if (iwait !=0 && ret==1)
- {
- for (curtrack=0; curtrack<16; curtrack++)
- if (track[curtrack].on)
- track[curtrack].iwait-=iwait;
-
-
-fwait=1.0f/(((float)iwait/(float)deltas)*((float)msqtr/(float)1000000));
- }
- else
- fwait=50; // 1/50th of a second
-
- midiprintf ("\n");
- for (i=0; i<16; i++)
- if (track[i].on) {
- if (track[i].pos < track[i].tend)
- midiprintf ("<%lu>",track[i].iwait);
- else
- midiprintf("stop");
- }
-
- /*
- if (ret==0 && type==FILE_ADVSIERRA)
- if (datalook(sierra_pos-2)!=0xff)
- {
- midiprintf ("next sectoin!");
- sierra_next_section(p);
- fwait=50;
- ret=1;
- }
- */
-
- if(ret)
- return true;
- else
- return false;
-}
-
-float CmidPlayer::getrefresh()
-{
- return (fwait > 0.01f ? fwait : 0.01f);
-}
-
-void CmidPlayer::rewind(int subsong)
-{
- long i,j,n,m,l;
- long o_sierra_pos;
- unsigned char ins[16];
-
- pos=0; tins=0;
- adlib_style=MIDI_STYLE|CMF_STYLE;
- adlib_mode=ADLIB_MELODIC;
- for (i=0; i<128; i++)
- for (j=0; j<16; j++)
- myinsbank[i][j]=midi_fm_instruments[i][j];
- for (i=0; i<16; i++)
- {
- ch[i].inum=0;
- for (j=0; j<11; j++)
- ch[i].ins[j]=myinsbank[ch[i].inum][j];
- ch[i].vol=127;
- ch[i].nshift=-25;
- ch[i].on=1;
- }
-
- /* General init */
- for (i=0; i<9; i++)
- {
- chp[i][0]=-1;
- chp[i][2]=0;
- }
-
- deltas=250; // just a number, not a standard
- msqtr=500000;
- fwait=123; // gotta be a small thing.. sorta like nothing
- iwait=0;
-
- subsongs=1;
-
- for (i=0; i<16; i++)
- {
- track[i].tend=0;
- track[i].spos=0;
- track[i].pos=0;
- track[i].iwait=0;
- track[i].on=0;
- track[i].pv=0;
- }
- curtrack=0;
-
- /* specific to file-type init */
-
- pos=0;
- i=getnext(1);
- switch(type)
- {
- case FILE_LUCAS:
- getnext(24); //skip junk and get to the midi.
- adlib_style=LUCAS_STYLE|MIDI_STYLE;
- //note: no break, we go right into midi headers...
- case FILE_MIDI:
- if (type != FILE_LUCAS)
- tins=128;
- getnext(11); /*skip header*/
- deltas=getnext(2);
- midiprintf ("deltas:%ld\n",deltas);
- getnext(4);
-
- curtrack=0;
- track[curtrack].on=1;
- track[curtrack].tend=getnext(4);
- track[curtrack].spos=pos;
- midiprintf ("tracklen:%lu\n",track[curtrack].tend);
- break;
- case FILE_CMF:
- getnext(3); // ctmf
- getnexti(2); //version
- n=getnexti(2); // instrument offset
- m=getnexti(2); // music offset
- deltas=getnexti(2); //ticks/qtr note
- msqtr=1000000/getnexti(2)*deltas;
- //the stuff in the cmf is click ticks per second..
-
- i=getnexti(2);
- if(i) title = (char *)data+i;
- i=getnexti(2);
- if(i) author = (char *)data+i;
- i=getnexti(2);
- if(i) remarks = (char *)data+i;
-
- getnext(16); // channel in use table ..
- i=getnexti(2); // num instr
- if (i>128) i=128; // to ward of bad numbers...
- getnexti(2); //basic tempo
-
- midiprintf("\nioff:%ld\nmoff%ld\ndeltas:%ld\nmsqtr:%ld\nnumi:%ld\n",
- n,m,deltas,msqtr,i);
- pos=n; // jump to instruments
- tins=i;
- for (j=0; j<i; j++)
- {
- midiprintf ("\n%ld: ",j);
- for (l=0; l<16; l++)
- {
- myinsbank[j][l]=(unsigned char)getnext(1);
- midiprintf ("%2X ",myinsbank[j][l]);
- }
- }
-
- for (i=0; i<16; i++)
- ch[i].nshift=-13;
-
- adlib_style=CMF_STYLE;
-
- curtrack=0;
- track[curtrack].on=1;
- track[curtrack].tend=flen; // music until the end of the file
- track[curtrack].spos=m; //jump to midi music
- break;
- case FILE_OLDLUCAS:
- msqtr=250000;
- pos=9;
- deltas=getnext(1);
-
- i=8;
- pos=0x19; // jump to instruments
- tins=i;
- for (j=0; j<i; j++)
- {
- midiprintf ("\n%ld: ",j);
- for (l=0; l<16; l++)
- ins[l]=(unsigned char)getnext(1);
-
- myinsbank[j][10]=ins[2];
- myinsbank[j][0]=ins[3];
- myinsbank[j][2]=ins[4];
- myinsbank[j][4]=ins[5];
- myinsbank[j][6]=ins[6];
- myinsbank[j][8]=ins[7];
- myinsbank[j][1]=ins[8];
- myinsbank[j][3]=ins[9];
- myinsbank[j][5]=ins[10];
- myinsbank[j][7]=ins[11];
- myinsbank[j][9]=ins[12];
-
- for (l=0; l<11; l++)
- midiprintf ("%2X ",myinsbank[j][l]);
- }
-
- for (i=0; i<16; i++)
- {
- if (i<tins)
- {
- ch[i].inum=i;
- for (j=0; j<11; j++)
- ch[i].ins[j]=myinsbank[ch[i].inum][j];
- }
- }
-
- adlib_style=LUCAS_STYLE|MIDI_STYLE;
-
- curtrack=0;
- track[curtrack].on=1;
- track[curtrack].tend=flen; // music until the end of the file
- track[curtrack].spos=0x98; //jump to midi music
- break;
- case FILE_ADVSIERRA:
- memcpy(myinsbank, smyinsbank, 128 * 16);
- tins = stins;
- deltas=0x20;
- getnext(11); //worthless empty space and "stuff" :)
-
- o_sierra_pos=sierra_pos=pos;
- sierra_next_section();
- while (datalook(sierra_pos-2)!=0xff)
- {
- sierra_next_section();
- subsongs++;
- }
-
- if (subsong < 0 || subsong >= subsongs) subsong=0;
-
- sierra_pos=o_sierra_pos;
- sierra_next_section();
- i=0;
- while (i != subsong)
- {
- sierra_next_section();
- i++;
- }
-
- adlib_style=SIERRA_STYLE|MIDI_STYLE; //advanced sierra tunes use volume
- break;
- case FILE_SIERRA:
- memcpy(myinsbank, smyinsbank, 128 * 16);
- tins = stins;
- getnext(2);
- deltas=0x20;
-
- curtrack=0;
- track[curtrack].on=1;
- track[curtrack].tend=flen; // music until the end of the file
-
- for (i=0; i<16; i++)
- {
- ch[i].nshift=-13;
- ch[i].on=getnext(1);
- ch[i].inum=getnext(1);
- for (j=0; j<11; j++)
- ch[i].ins[j]=myinsbank[ch[i].inum][j];
- }
-
- track[curtrack].spos=pos;
- adlib_style=SIERRA_STYLE|MIDI_STYLE;
- break;
- }
-
-
-/* sprintf(info,"%s\r\nTicks/Quarter Note: %ld\r\n",info,deltas);
- sprintf(info,"%sms/Quarter Note: %ld",info,msqtr); */
-
- for (i=0; i<16; i++)
- if (track[i].on)
- {
- track[i].pos=track[i].spos;
- track[i].pv=0;
- track[i].iwait=0;
- }
-
- doing=1;
- midi_fm_reset();
-}
-
-std::string CmidPlayer::gettype()
-{
- switch(type) {
- case FILE_LUCAS:
- return std::string("LucasArts AdLib MIDI");
- case FILE_MIDI:
- return std::string("General MIDI");
- case FILE_CMF:
- return std::string("Creative Music Format (CMF MIDI)");
- case FILE_OLDLUCAS:
- return std::string("Lucasfilm Adlib MIDI");
- case FILE_ADVSIERRA:
- return std::string("Sierra On-Line VGA MIDI");
- case FILE_SIERRA:
- return std::string("Sierra On-Line EGA MIDI");
- default:
- return std::string("MIDI unknown");
- }
-}
diff --git a/src/adplug/core/mid.h b/src/adplug/core/mid.h
deleted file mode 100644
index 04bed21..0000000
--- a/src/adplug/core/mid.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * mid.h - LAA, SCI, MID & CMF Player by Philip Hassey <philhassey@hotmail.com>
- */
-
-#include "player.h"
-
-class CmidPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CmidPlayer(Copl *newopl);
- ~CmidPlayer()
- { if(data) delete [] data; }
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle()
- { return std::string(title); }
- std::string getauthor()
- { return std::string(author); }
- std::string getdesc()
- { return std::string(remarks); }
- unsigned int getinstruments()
- { return tins; }
- unsigned int getsubsongs()
- { return subsongs; }
-
- protected:
- static const unsigned char adlib_opadd[];
- static const int ops[], map_chan[], fnums[], percussion_map[];
-
- struct midi_channel {
- int inum;
- unsigned char ins[11];
- int vol;
- int nshift;
- int on;
- };
-
- struct midi_track {
- unsigned long tend;
- unsigned long spos;
- unsigned long pos;
- unsigned long iwait;
- int on;
- unsigned char pv;
- };
-
- char *author,*title,*remarks,emptystr;
- long flen;
- unsigned long pos;
- unsigned long sierra_pos; //sierras gotta be special.. :>
- int subsongs;
- unsigned char *data;
-
- unsigned char adlib_data[256];
- int adlib_style;
- int adlib_mode;
- unsigned char myinsbank[128][16], smyinsbank[128][16];
- midi_channel ch[16];
- int chp[18][3];
-
- long deltas;
- long msqtr;
-
- midi_track track[16];
- unsigned int curtrack;
-
- float fwait;
- unsigned long iwait;
- int doing;
-
- int type,tins,stins;
-
- private:
- bool load_sierra_ins(const std::string &fname, const CFileProvider &fp);
- void midiprintf(const char *format, ...);
- unsigned char datalook(long pos);
- unsigned long getnexti(unsigned long num);
- unsigned long getnext(unsigned long num);
- unsigned long getval();
- void sierra_next_section();
- void midi_write_adlib(unsigned int r, unsigned char v);
- void midi_fm_instrument(int voice, unsigned char *inst);
- void midi_fm_percussion(int ch, unsigned char *inst);
- void midi_fm_volume(int voice, int volume);
- void midi_fm_playnote(int voice, int note, int volume);
- void midi_fm_endnote(int voice);
- void midi_fm_reset();
-};
diff --git a/src/adplug/core/mididata.h b/src/adplug/core/mididata.h
deleted file mode 100644
index cab4d27..0000000
--- a/src/adplug/core/mididata.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999, 2000, 2001 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- *
- * FM instrument definitions below borrowed from the Allegro library by
- * Phil Hassey, <philhassey@hotmail.com> - see "adplug/players/mid.cpp"
- * for further acknowledgements.
- */
-
-unsigned char midi_fm_instruments[128][16] =
-{
-
- /* This set of GM instrument patches was provided by Jorrit Rouwe...
- */
-
- { 0x21, 0x21, 0x8f, 0x0c, 0xf2, 0xf2, 0x45, 0x76, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Acoustic Grand */
- { 0x31, 0x21, 0x4b, 0x09, 0xf2, 0xf2, 0x54, 0x56, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Bright Acoustic */
- { 0x31, 0x21, 0x49, 0x09, 0xf2, 0xf2, 0x55, 0x76, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Electric Grand */
- { 0xb1, 0x61, 0x0e, 0x09, 0xf2, 0xf3, 0x3b, 0x0b, 0x00, 0x00, 0x06, 0, 0, 0 }, /* Honky-Tonk */
- { 0x01, 0x21, 0x57, 0x09, 0xf1, 0xf1, 0x38, 0x28, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Electric Piano 1 */
- { 0x01, 0x21, 0x93, 0x09, 0xf1, 0xf1, 0x38, 0x28, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Electric Piano 2 */
- { 0x21, 0x36, 0x80, 0x17, 0xa2, 0xf1, 0x01, 0xd5, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Harpsichord */
- { 0x01, 0x01, 0x92, 0x09, 0xc2, 0xc2, 0xa8, 0x58, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Clav */
- { 0x0c, 0x81, 0x5c, 0x09, 0xf6, 0xf3, 0x54, 0xb5, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Celesta */
- { 0x07, 0x11, 0x97, 0x89, 0xf6, 0xf5, 0x32, 0x11, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Glockenspiel */
- { 0x17, 0x01, 0x21, 0x09, 0x56, 0xf6, 0x04, 0x04, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Music Box */
- { 0x18, 0x81, 0x62, 0x09, 0xf3, 0xf2, 0xe6, 0xf6, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Vibraphone */
- { 0x18, 0x21, 0x23, 0x09, 0xf7, 0xe5, 0x55, 0xd8, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Marimba */
- { 0x15, 0x01, 0x91, 0x09, 0xf6, 0xf6, 0xa6, 0xe6, 0x00, 0x00, 0x04, 0, 0, 0 }, /* Xylophone */
- { 0x45, 0x81, 0x59, 0x89, 0xd3, 0xa3, 0x82, 0xe3, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Tubular Bells */
- { 0x03, 0x81, 0x49, 0x89, 0x74, 0xb3, 0x55, 0x05, 0x01, 0x00, 0x04, 0, 0, 0 }, /* Dulcimer */
- { 0x71, 0x31, 0x92, 0x09, 0xf6, 0xf1, 0x14, 0x07, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Drawbar Organ */
- { 0x72, 0x30, 0x14, 0x09, 0xc7, 0xc7, 0x58, 0x08, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Percussive Organ */
- { 0x70, 0xb1, 0x44, 0x09, 0xaa, 0x8a, 0x18, 0x08, 0x00, 0x00, 0x04, 0, 0, 0 }, /* Rock Organ */
- { 0x23, 0xb1, 0x93, 0x09, 0x97, 0x55, 0x23, 0x14, 0x01, 0x00, 0x04, 0, 0, 0 }, /* Church Organ */
- { 0x61, 0xb1, 0x13, 0x89, 0x97, 0x55, 0x04, 0x04, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Reed Organ */
- { 0x24, 0xb1, 0x48, 0x09, 0x98, 0x46, 0x2a, 0x1a, 0x01, 0x00, 0x0c, 0, 0, 0 }, /* Accoridan */
- { 0x61, 0x21, 0x13, 0x09, 0x91, 0x61, 0x06, 0x07, 0x01, 0x00, 0x0a, 0, 0, 0 }, /* Harmonica */
- { 0x21, 0xa1, 0x13, 0x92, 0x71, 0x61, 0x06, 0x07, 0x00, 0x00, 0x06, 0, 0, 0 }, /* Tango Accordian */
- { 0x02, 0x41, 0x9c, 0x89, 0xf3, 0xf3, 0x94, 0xc8, 0x01, 0x00, 0x0c, 0, 0, 0 }, /* Acoustic Guitar(nylon) */
- { 0x03, 0x11, 0x54, 0x09, 0xf3, 0xf1, 0x9a, 0xe7, 0x01, 0x00, 0x0c, 0, 0, 0 }, /* Acoustic Guitar(steel) */
- { 0x23, 0x21, 0x5f, 0x09, 0xf1, 0xf2, 0x3a, 0xf8, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Electric Guitar(jazz) */
- { 0x03, 0x21, 0x87, 0x89, 0xf6, 0xf3, 0x22, 0xf8, 0x01, 0x00, 0x06, 0, 0, 0 }, /* Electric Guitar(clean) */
- { 0x03, 0x21, 0x47, 0x09, 0xf9, 0xf6, 0x54, 0x3a, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Electric Guitar(muted) */
- { 0x23, 0x21, 0x4a, 0x0e, 0x91, 0x84, 0x41, 0x19, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Overdriven Guitar */
- { 0x23, 0x21, 0x4a, 0x09, 0x95, 0x94, 0x19, 0x19, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Distortion Guitar */
- { 0x09, 0x84, 0xa1, 0x89, 0x20, 0xd1, 0x4f, 0xf8, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Guitar Harmonics */
- { 0x21, 0xa2, 0x1e, 0x09, 0x94, 0xc3, 0x06, 0xa6, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Acoustic Bass */
- { 0x31, 0x31, 0x12, 0x09, 0xf1, 0xf1, 0x28, 0x18, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Electric Bass(finger) */
- { 0x31, 0x31, 0x8d, 0x09, 0xf1, 0xf1, 0xe8, 0x78, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Electric Bass(pick) */
- { 0x31, 0x32, 0x5b, 0x09, 0x51, 0x71, 0x28, 0x48, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Fretless Bass */
- { 0x01, 0x21, 0x8b, 0x49, 0xa1, 0xf2, 0x9a, 0xdf, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Slap Bass 1 */
- { 0x21, 0x21, 0x8b, 0x11, 0xa2, 0xa1, 0x16, 0xdf, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Slap Bass 2 */
- { 0x31, 0x31, 0x8b, 0x09, 0xf4, 0xf1, 0xe8, 0x78, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Synth Bass 1 */
- { 0x31, 0x31, 0x12, 0x09, 0xf1, 0xf1, 0x28, 0x18, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Synth Bass 2 */
- { 0x31, 0x21, 0x15, 0x09, 0xdd, 0x56, 0x13, 0x26, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Violin */
- { 0x31, 0x21, 0x16, 0x09, 0xdd, 0x66, 0x13, 0x06, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Viola */
- { 0x71, 0x31, 0x49, 0x09, 0xd1, 0x61, 0x1c, 0x0c, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Cello */
- { 0x21, 0x23, 0x4d, 0x89, 0x71, 0x72, 0x12, 0x06, 0x01, 0x00, 0x02, 0, 0, 0 }, /* Contrabass */
- { 0xf1, 0xe1, 0x40, 0x09, 0xf1, 0x6f, 0x21, 0x16, 0x01, 0x00, 0x02, 0, 0, 0 }, /* Tremolo Strings */
- { 0x02, 0x01, 0x1a, 0x89, 0xf5, 0x85, 0x75, 0x35, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Pizzicato Strings */
- { 0x02, 0x01, 0x1d, 0x89, 0xf5, 0xf3, 0x75, 0xf4, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Orchestral Strings */
- { 0x10, 0x11, 0x41, 0x09, 0xf5, 0xf2, 0x05, 0xc3, 0x01, 0x00, 0x02, 0, 0, 0 }, /* Timpani */
- { 0x21, 0xa2, 0x9b, 0x0a, 0xb1, 0x72, 0x25, 0x08, 0x01, 0x00, 0x0e, 0, 0, 0 }, /* String Ensemble 1 */
- { 0xa1, 0x21, 0x98, 0x09, 0x7f, 0x3f, 0x03, 0x07, 0x01, 0x01, 0x00, 0, 0, 0 }, /* String Ensemble 2 */
- { 0xa1, 0x61, 0x93, 0x09, 0xc1, 0x4f, 0x12, 0x05, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* SynthStrings 1 */
- { 0x21, 0x61, 0x18, 0x09, 0xc1, 0x4f, 0x22, 0x05, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* SynthStrings 2 */
- { 0x31, 0x72, 0x5b, 0x8c, 0xf4, 0x8a, 0x15, 0x05, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Choir Aahs */
- { 0xa1, 0x61, 0x90, 0x09, 0x74, 0x71, 0x39, 0x67, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Voice Oohs */
- { 0x71, 0x72, 0x57, 0x09, 0x54, 0x7a, 0x05, 0x05, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Synth Voice */
- { 0x90, 0x41, 0x00, 0x09, 0x54, 0xa5, 0x63, 0x45, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Orchestra Hit */
- { 0x21, 0x21, 0x92, 0x0a, 0x85, 0x8f, 0x17, 0x09, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Trumpet */
- { 0x21, 0x21, 0x94, 0x0e, 0x75, 0x8f, 0x17, 0x09, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Trombone */
- { 0x21, 0x61, 0x94, 0x09, 0x76, 0x82, 0x15, 0x37, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Tuba */
- { 0x31, 0x21, 0x43, 0x09, 0x9e, 0x62, 0x17, 0x2c, 0x01, 0x01, 0x02, 0, 0, 0 }, /* Muted Trumpet */
- { 0x21, 0x21, 0x9b, 0x09, 0x61, 0x7f, 0x6a, 0x0a, 0x00, 0x00, 0x02, 0, 0, 0 }, /* French Horn */
- { 0x61, 0x22, 0x8a, 0x0f, 0x75, 0x74, 0x1f, 0x0f, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Brass Section */
- { 0xa1, 0x21, 0x86, 0x8c, 0x72, 0x71, 0x55, 0x18, 0x01, 0x00, 0x00, 0, 0, 0 }, /* SynthBrass 1 */
- { 0x21, 0x21, 0x4d, 0x09, 0x54, 0xa6, 0x3c, 0x1c, 0x00, 0x00, 0x08, 0, 0, 0 }, /* SynthBrass 2 */
- { 0x31, 0x61, 0x8f, 0x09, 0x93, 0x72, 0x02, 0x0b, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Soprano Sax */
- { 0x31, 0x61, 0x8e, 0x09, 0x93, 0x72, 0x03, 0x09, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Alto Sax */
- { 0x31, 0x61, 0x91, 0x09, 0x93, 0x82, 0x03, 0x09, 0x01, 0x00, 0x0a, 0, 0, 0 }, /* Tenor Sax */
- { 0x31, 0x61, 0x8e, 0x09, 0x93, 0x72, 0x0f, 0x0f, 0x01, 0x00, 0x0a, 0, 0, 0 }, /* Baritone Sax */
- { 0x21, 0x21, 0x4b, 0x09, 0xaa, 0x8f, 0x16, 0x0a, 0x01, 0x00, 0x08, 0, 0, 0 }, /* Oboe */
- { 0x31, 0x21, 0x90, 0x09, 0x7e, 0x8b, 0x17, 0x0c, 0x01, 0x01, 0x06, 0, 0, 0 }, /* English Horn */
- { 0x31, 0x32, 0x81, 0x09, 0x75, 0x61, 0x19, 0x19, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Bassoon */
- { 0x32, 0x21, 0x90, 0x09, 0x9b, 0x72, 0x21, 0x17, 0x00, 0x00, 0x04, 0, 0, 0 }, /* Clarinet */
- { 0xe1, 0xe1, 0x1f, 0x09, 0x85, 0x65, 0x5f, 0x1a, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Piccolo */
- { 0xe1, 0xe1, 0x46, 0x09, 0x88, 0x65, 0x5f, 0x1a, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Flute */
- { 0xa1, 0x21, 0x9c, 0x09, 0x75, 0x75, 0x1f, 0x0a, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Recorder */
- { 0x31, 0x21, 0x8b, 0x09, 0x84, 0x65, 0x58, 0x1a, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Pan Flute */
- { 0xe1, 0xa1, 0x4c, 0x09, 0x66, 0x65, 0x56, 0x26, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Blown Bottle */
- { 0x62, 0xa1, 0xcb, 0x09, 0x76, 0x55, 0x46, 0x36, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Skakuhachi */
- { 0x62, 0xa1, 0xa2, 0x09, 0x57, 0x56, 0x07, 0x07, 0x00, 0x00, 0x0b, 0, 0, 0 }, /* Whistle */
- { 0x62, 0xa1, 0x9c, 0x09, 0x77, 0x76, 0x07, 0x07, 0x00, 0x00, 0x0b, 0, 0, 0 }, /* Ocarina */
- { 0x22, 0x21, 0x59, 0x09, 0xff, 0xff, 0x03, 0x0f, 0x02, 0x00, 0x00, 0, 0, 0 }, /* Lead 1 (square) */
- { 0x21, 0x21, 0x0e, 0x09, 0xff, 0xff, 0x0f, 0x0f, 0x01, 0x01, 0x00, 0, 0, 0 }, /* Lead 2 (sawtooth) */
- { 0x22, 0x21, 0x46, 0x89, 0x86, 0x64, 0x55, 0x18, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Lead 3 (calliope) */
- { 0x21, 0xa1, 0x45, 0x09, 0x66, 0x96, 0x12, 0x0a, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Lead 4 (chiff) */
- { 0x21, 0x22, 0x8b, 0x09, 0x92, 0x91, 0x2a, 0x2a, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Lead 5 (charang) */
- { 0xa2, 0x61, 0x9e, 0x49, 0xdf, 0x6f, 0x05, 0x07, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Lead 6 (voice) */
- { 0x20, 0x60, 0x1a, 0x09, 0xef, 0x8f, 0x01, 0x06, 0x00, 0x02, 0x00, 0, 0, 0 }, /* Lead 7 (fifths) */
- { 0x21, 0x21, 0x8f, 0x86, 0xf1, 0xf4, 0x29, 0x09, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Lead 8 (bass+lead) */
- { 0x77, 0xa1, 0xa5, 0x09, 0x53, 0xa0, 0x94, 0x05, 0x00, 0x00, 0x02, 0, 0, 0 }, /* Pad 1 (new age) */
- { 0x61, 0xb1, 0x1f, 0x89, 0xa8, 0x25, 0x11, 0x03, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Pad 2 (warm) */
- { 0x61, 0x61, 0x17, 0x09, 0x91, 0x55, 0x34, 0x16, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Pad 3 (polysynth) */
- { 0x71, 0x72, 0x5d, 0x09, 0x54, 0x6a, 0x01, 0x03, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Pad 4 (choir) */
- { 0x21, 0xa2, 0x97, 0x09, 0x21, 0x42, 0x43, 0x35, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Pad 5 (bowed) */
- { 0xa1, 0x21, 0x1c, 0x09, 0xa1, 0x31, 0x77, 0x47, 0x01, 0x01, 0x00, 0, 0, 0 }, /* Pad 6 (metallic) */
- { 0x21, 0x61, 0x89, 0x0c, 0x11, 0x42, 0x33, 0x25, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Pad 7 (halo) */
- { 0xa1, 0x21, 0x15, 0x09, 0x11, 0xcf, 0x47, 0x07, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Pad 8 (sweep) */
- { 0x3a, 0x51, 0xce, 0x09, 0xf8, 0x86, 0xf6, 0x02, 0x00, 0x00, 0x02, 0, 0, 0 }, /* FX 1 (rain) */
- { 0x21, 0x21, 0x15, 0x09, 0x21, 0x41, 0x23, 0x13, 0x01, 0x00, 0x00, 0, 0, 0 }, /* FX 2 (soundtrack) */
- { 0x06, 0x01, 0x5b, 0x09, 0x74, 0xa5, 0x95, 0x72, 0x00, 0x00, 0x00, 0, 0, 0 }, /* FX 3 (crystal) */
- { 0x22, 0x61, 0x92, 0x8c, 0xb1, 0xf2, 0x81, 0x26, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* FX 4 (atmosphere) */
- { 0x41, 0x42, 0x4d, 0x09, 0xf1, 0xf2, 0x51, 0xf5, 0x01, 0x00, 0x00, 0, 0, 0 }, /* FX 5 (brightness) */
- { 0x61, 0xa3, 0x94, 0x89, 0x11, 0x11, 0x51, 0x13, 0x01, 0x00, 0x06, 0, 0, 0 }, /* FX 6 (goblins) */
- { 0x61, 0xa1, 0x8c, 0x89, 0x11, 0x1d, 0x31, 0x03, 0x00, 0x00, 0x06, 0, 0, 0 }, /* FX 7 (echoes) */
- { 0xa4, 0x61, 0x4c, 0x09, 0xf3, 0x81, 0x73, 0x23, 0x01, 0x00, 0x04, 0, 0, 0 }, /* FX 8 (sci-fi) */
- { 0x02, 0x07, 0x85, 0x0c, 0xd2, 0xf2, 0x53, 0xf6, 0x00, 0x01, 0x00, 0, 0, 0 }, /* Sitar */
- { 0x11, 0x13, 0x0c, 0x89, 0xa3, 0xa2, 0x11, 0xe5, 0x01, 0x00, 0x00, 0, 0, 0 }, /* Banjo */
- { 0x11, 0x11, 0x06, 0x09, 0xf6, 0xf2, 0x41, 0xe6, 0x01, 0x02, 0x04, 0, 0, 0 }, /* Shamisen */
- { 0x93, 0x91, 0x91, 0x09, 0xd4, 0xeb, 0x32, 0x11, 0x00, 0x01, 0x08, 0, 0, 0 }, /* Koto */
- { 0x04, 0x01, 0x4f, 0x09, 0xfa, 0xc2, 0x56, 0x05, 0x00, 0x00, 0x0c, 0, 0, 0 }, /* Kalimba */
- { 0x21, 0x22, 0x49, 0x09, 0x7c, 0x6f, 0x20, 0x0c, 0x00, 0x01, 0x06, 0, 0, 0 }, /* Bagpipe */
- { 0x31, 0x21, 0x85, 0x09, 0xdd, 0x56, 0x33, 0x16, 0x01, 0x00, 0x0a, 0, 0, 0 }, /* Fiddle */
- { 0x20, 0x21, 0x04, 0x8a, 0xda, 0x8f, 0x05, 0x0b, 0x02, 0x00, 0x06, 0, 0, 0 }, /* Shanai */
- { 0x05, 0x03, 0x6a, 0x89, 0xf1, 0xc3, 0xe5, 0xe5, 0x00, 0x00, 0x06, 0, 0, 0 }, /* Tinkle Bell */
- { 0x07, 0x02, 0x15, 0x09, 0xec, 0xf8, 0x26, 0x16, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Agogo */
- { 0x05, 0x01, 0x9d, 0x09, 0x67, 0xdf, 0x35, 0x05, 0x00, 0x00, 0x08, 0, 0, 0 }, /* Steel Drums */
- { 0x18, 0x12, 0x96, 0x09, 0xfa, 0xf8, 0x28, 0xe5, 0x00, 0x00, 0x0a, 0, 0, 0 }, /* Woodblock */
- { 0x10, 0x00, 0x86, 0x0c, 0xa8, 0xfa, 0x07, 0x03, 0x00, 0x00, 0x06, 0, 0, 0 }, /* Taiko Drum */
- { 0x11, 0x10, 0x41, 0x0c, 0xf8, 0xf3, 0x47, 0x03, 0x02, 0x00, 0x04, 0, 0, 0 }, /* Melodic Tom */
- { 0x01, 0x10, 0x8e, 0x09, 0xf1, 0xf3, 0x06, 0x02, 0x02, 0x00, 0x0e, 0, 0, 0 }, /* Synth Drum */
- { 0x0e, 0xc0, 0x00, 0x09, 0x1f, 0x1f, 0x00, 0xff, 0x00, 0x03, 0x0e, 0, 0, 0 }, /* Reverse Cymbal */
- { 0x06, 0x03, 0x80, 0x91, 0xf8, 0x56, 0x24, 0x84, 0x00, 0x02, 0x0e, 0, 0, 0 }, /* Guitar Fret Noise */
- { 0x0e, 0xd0, 0x00, 0x0e, 0xf8, 0x34, 0x00, 0x04, 0x00, 0x03, 0x0e, 0, 0, 0 }, /* Breath Noise */
- { 0x0e, 0xc0, 0x00, 0x09, 0xf6, 0x1f, 0x00, 0x02, 0x00, 0x03, 0x0e, 0, 0, 0 }, /* Seashore */
- { 0xd5, 0xda, 0x95, 0x49, 0x37, 0x56, 0xa3, 0x37, 0x00, 0x00, 0x00, 0, 0, 0 }, /* Bird Tweet */
- { 0x35, 0x14, 0x5c, 0x11, 0xb2, 0xf4, 0x61, 0x15, 0x02, 0x00, 0x0a, 0, 0, 0 }, /* Telephone ring */
- { 0x0e, 0xd0, 0x00, 0x09, 0xf6, 0x4f, 0x00, 0xf5, 0x00, 0x03, 0x0e, 0, 0, 0 }, /* Helicopter */
- { 0x26, 0xe4, 0x00, 0x09, 0xff, 0x12, 0x01, 0x16, 0x00, 0x01, 0x0e, 0, 0, 0 }, /* Applause */
- { 0x00, 0x00, 0x00, 0x09, 0xf3, 0xf6, 0xf0, 0xc9, 0x00, 0x02, 0x0e, 0, 0, 0 } /* Gunshot */
-
-};
-
-/* logarithmic relationship between midi and FM volumes */
-static int my_midi_fm_vol_table[128] = {
- 0, 11, 16, 19, 22, 25, 27, 29, 32, 33, 35, 37, 39, 40, 42, 43,
- 45, 46, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
- 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77,
- 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 89,
- 90, 91, 91, 92, 93, 93, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100,
- 101, 101, 102, 103, 103, 104, 104, 105, 106, 106, 107, 107, 108,
- 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 115,
- 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122,
- 123, 123, 124, 124, 125, 125, 126, 126, 127
-};
-
diff --git a/src/adplug/core/mkj.cc b/src/adplug/core/mkj.cc
deleted file mode 100644
index f19a14c..0000000
--- a/src/adplug/core/mkj.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * mkj.cpp - MKJamz Player, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <cstring>
-#include <assert.h>
-
-#include "mkj.h"
-#include "debug.h"
-
-CPlayer *CmkjPlayer::factory(Copl *newopl)
-{
- return new CmkjPlayer(newopl);
-}
-
-bool CmkjPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[6];
- float ver;
- int i, j;
- short inst[8];
-
- // file validation
- f->readString(id, 6);
- if(strncmp(id,"MKJamz",6)) { fp.close(f); return false; }
- ver = f->readFloat(binio::Single);
- if(ver > 1.12) { fp.close(f); return false; }
-
- // load
- maxchannel = f->readInt(2);
- opl->init(); opl->write(1, 32);
- for(i = 0; i < maxchannel; i++) {
- for(j = 0; j < 8; j++) inst[j] = f->readInt(2);
- opl->write(0x20+op_table[i],inst[4]);
- opl->write(0x23+op_table[i],inst[0]);
- opl->write(0x40+op_table[i],inst[5]);
- opl->write(0x43+op_table[i],inst[1]);
- opl->write(0x60+op_table[i],inst[6]);
- opl->write(0x63+op_table[i],inst[2]);
- opl->write(0x80+op_table[i],inst[7]);
- opl->write(0x83+op_table[i],inst[3]);
- }
- maxnotes = f->readInt(2);
- songbuf = new short [(maxchannel+1)*maxnotes];
- for(i = 0; i < maxchannel; i++) channel[i].defined = f->readInt(2);
- for(i = 0; i < (maxchannel + 1) * maxnotes; i++)
- songbuf[i] = f->readInt(2);
-
- AdPlug_LogWrite("CmkjPlayer::load(\"%s\"): loaded file ver %.2f, %d channels,"
- " %d notes/channel.\n", filename.c_str(), ver, maxchannel,
- maxnotes);
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CmkjPlayer::update()
-{
- int c, i;
- short note;
-
- for(c = 0; c < maxchannel; c++) {
- if(!channel[c].defined) // skip if channel is disabled
- continue;
-
- if(channel[c].pstat) {
- channel[c].pstat--;
- continue;
- }
-
- opl->write(0xb0 + c, 0); // key off
- do {
- assert(channel[c].songptr < (maxchannel + 1) * maxnotes);
- note = songbuf[channel[c].songptr];
- if(channel[c].songptr - c > maxchannel)
- if(note && note < 250)
- channel[c].pstat = channel[c].speed;
- switch(note) {
- // normal notes
- case 68: opl->write(0xa0 + c,0x81); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 69: opl->write(0xa0 + c,0xb0); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 70: opl->write(0xa0 + c,0xca); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 71: opl->write(0xa0 + c,0x2); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 65: opl->write(0xa0 + c,0x41); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 66: opl->write(0xa0 + c,0x87); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 67: opl->write(0xa0 + c,0xae); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 17: opl->write(0xa0 + c,0x6b); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 18: opl->write(0xa0 + c,0x98); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 20: opl->write(0xa0 + c,0xe5); opl->write(0xb0 + c,0x21 + 4 * channel[c].octave); break;
- case 21: opl->write(0xa0 + c,0x20); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 15: opl->write(0xa0 + c,0x63); opl->write(0xb0 + c,0x22 + 4 * channel[c].octave); break;
- case 255: // delay
- channel[c].songptr += maxchannel;
- channel[c].pstat = songbuf[channel[c].songptr];
- break;
- case 254: // set octave
- channel[c].songptr += maxchannel;
- channel[c].octave = songbuf[channel[c].songptr];
- break;
- case 253: // set speed
- channel[c].songptr += maxchannel;
- channel[c].speed = songbuf[channel[c].songptr];
- break;
- case 252: // set waveform
- channel[c].songptr += maxchannel;
- channel[c].waveform = songbuf[channel[c].songptr] - 300;
- if(c > 2)
- opl->write(0xe0 + c + (c+6),channel[c].waveform);
- else
- opl->write(0xe0 + c,channel[c].waveform);
- break;
- case 251: // song end
- for(i = 0; i < maxchannel; i++) channel[i].songptr = i;
- songend = true;
- return false;
- }
-
- if(channel[c].songptr - c < maxnotes)
- channel[c].songptr += maxchannel;
- else
- channel[c].songptr = c;
- } while(!channel[c].pstat);
- }
-
- return !songend;
-}
-
-void CmkjPlayer::rewind(int subsong)
-{
- int i;
-
- for(i = 0; i < maxchannel; i++) {
- channel[i].pstat = 0;
- channel[i].speed = 0;
- channel[i].waveform = 0;
- channel[i].songptr = i;
- channel[i].octave = 4;
- }
-
- songend = false;
-}
-
-float CmkjPlayer::getrefresh()
-{
- return 100.0f;
-}
diff --git a/src/adplug/core/mkj.h b/src/adplug/core/mkj.h
deleted file mode 100644
index edb857f..0000000
--- a/src/adplug/core/mkj.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * mkj.h - MKJamz Player, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CmkjPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CmkjPlayer(Copl *newopl)
- : CPlayer(newopl), songbuf(0)
- { }
- ~CmkjPlayer()
- { if(songbuf) delete [] songbuf; }
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- { return std::string("MKJamz Audio File"); }
-
-private:
- short maxchannel,maxnotes,*songbuf;
- bool songend;
-
- struct {
- short defined,songptr,octave,waveform,pstat,speed,delay;
- } channel[9];
-};
diff --git a/src/adplug/core/msc.cc b/src/adplug/core/msc.cc
deleted file mode 100644
index ddf09c7..0000000
--- a/src/adplug/core/msc.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * msc.c - MSC Player by Lubomir Bulej (pallas@kadan.cz)
- */
-
-#include <cstring>
-#include <stdio.h>
-
-#include "msc.h"
-#include "debug.h"
-
-const unsigned char CmscPlayer::msc_signature [MSC_SIGN_LEN] = {
- 'C', 'e', 'r', 'e', 's', ' ', '\x13', ' ',
- 'M', 'S', 'C', 'p', 'l', 'a', 'y', ' ' };
-
-/*** public methods *************************************/
-
-CPlayer *CmscPlayer::factory (Copl * newopl)
-{
- return new CmscPlayer (newopl);
-}
-
-CmscPlayer::CmscPlayer(Copl * newopl) : CPlayer (newopl)
-{
- desc = NULL;
- msc_data = NULL;
- raw_data = NULL;
- nr_blocks = 0;
-}
-
-CmscPlayer::~CmscPlayer()
-{
- if (raw_data != NULL)
- delete [] raw_data;
-
- if (msc_data != NULL) {
- // free compressed blocks
- for (int blk_num = 0; blk_num < nr_blocks; blk_num++) {
- if (msc_data [blk_num].mb_data != NULL)
- delete [] msc_data [blk_num].mb_data;
- }
-
- delete [] msc_data;
- }
-
- if (desc != NULL)
- delete [] desc;
-}
-
-bool CmscPlayer::load(const std::string & filename, const CFileProvider & fp)
-{
- binistream * bf;
- msc_header hdr;
-
- // open and validate the file
- bf = fp.open (filename);
- if (! bf)
- return false;
-
- if (! load_header (bf, & hdr)) {
- fp.close (bf);
- return false;
- }
-
- // get stuff from the header
- version = hdr.mh_ver;
- timer_div = hdr.mh_timer;
- nr_blocks = hdr.mh_nr_blocks;
- block_len = hdr.mh_block_len;
-
- if (! nr_blocks) {
- fp.close (bf);
- return false;
- }
-
- // load compressed data blocks
- msc_data = new msc_block [nr_blocks];
- raw_data = new u8 [block_len];
-
- for (int blk_num = 0; blk_num < nr_blocks; blk_num++) {
- msc_block blk;
-
- blk.mb_length = bf->readInt (2);
- blk.mb_data = new u8 [blk.mb_length];
- for (int oct_num = 0; oct_num < blk.mb_length; oct_num++) {
- blk.mb_data [oct_num] = bf->readInt (1);
- }
-
- msc_data [blk_num] = blk;
- }
-
- // clean up & initialize
- fp.close (bf);
- rewind (0);
-
- return true;
-}
-
-bool CmscPlayer::update()
-{
- // output data
- while (! delay) {
- u8 cmnd;
- u8 data;
-
- // decode data
- if (! decode_octet (& cmnd))
- return false;
-
- if (! decode_octet (& data))
- return false;
-
- // check for special commands
- switch (cmnd) {
-
- // delay
- case 0xff:
- delay = 1 + (u8) (data - 1);
- break;
-
- // play command & data
- default:
- opl->write (cmnd, data);
-
- } // command switch
- } // play pass
-
-
- // count delays
- if (delay)
- delay--;
-
- // advance player position
- play_pos++;
- return true;
-}
-
-void CmscPlayer::rewind(int subsong)
-{
- // reset state
- dec_prefix = 0;
- block_num = 0;
- block_pos = 0;
- play_pos = 0;
- raw_pos = 0;
- delay = 0;
-
- // init the OPL chip and go to OPL2 mode
- opl->init();
- opl->write(1, 32);
-}
-
-float CmscPlayer::getrefresh()
-{
- // PC timer oscillator frequency / wait register
- return 1193180 / (float) (timer_div ? timer_div : 0xffff);
-}
-
-std::string CmscPlayer::gettype()
-{
- char vstr [40];
-
- sprintf(vstr, "AdLib MSCplay (version %d)", version);
- return std::string (vstr);
-}
-
-/*** private methods *************************************/
-
-bool CmscPlayer::load_header(binistream * bf, msc_header * hdr)
-{
- // check signature
- bf->readString ((char *) hdr->mh_sign, sizeof (hdr->mh_sign));
- if (memcmp (msc_signature, hdr->mh_sign, MSC_SIGN_LEN) != 0)
- return false;
-
- // check version
- hdr->mh_ver = bf->readInt (2);
- if (hdr->mh_ver != 0)
- return false;
-
- bf->readString ((char *) hdr->mh_desc, sizeof (hdr->mh_desc));
- hdr->mh_timer = bf->readInt (2);
- hdr->mh_nr_blocks = bf->readInt (2);
- hdr->mh_block_len = bf->readInt (2);
- return true;
-}
-
-bool CmscPlayer::decode_octet(u8 * output)
-{
- msc_block blk; // compressed data block
-
- if (block_num >= nr_blocks)
- return false;
-
- blk = msc_data [block_num];
- while (1) {
- u8 octet; // decoded octet
- u8 len_corr = 0; // length correction
-
- // advance to next block if necessary
- if (block_pos >= blk.mb_length && dec_len == 0) {
- block_num++;
- if (block_num >= nr_blocks)
- return false;
-
- blk = msc_data [block_num];
- block_pos = 0;
- raw_pos = 0;
- }
-
- // decode the compressed music data
- switch (dec_prefix) {
-
- // decode prefix
- case 155:
- case 175:
- octet = blk.mb_data [block_pos++];
- if (octet == 0) {
- // invalid prefix, output original
- octet = dec_prefix;
- dec_prefix = 0;
- break;
- }
-
- // isolate length and distance
- dec_len = (octet & 0x0F);
- len_corr = 2;
-
- dec_dist = (octet & 0xF0) >> 4;
- if (dec_prefix == 155)
- dec_dist++;
-
- // next decode step for respective prefix type
- dec_prefix++;
- continue;
-
-
- // check for extended length
- case 156:
- if (dec_len == 15)
- dec_len += blk.mb_data [block_pos++];
-
- // add length correction and go for copy mode
- dec_len += len_corr;
- dec_prefix = 255;
- continue;
-
-
- // get extended distance
- case 176:
- dec_dist += 17 + 16 * blk.mb_data [block_pos++];
- len_corr = 3;
-
- // check for extended length
- dec_prefix = 156;
- continue;
-
-
- // prefix copy mode
- case 255:
- if((int)raw_pos >= dec_dist)
- octet = raw_data [raw_pos - dec_dist];
- else {
- AdPlug_LogWrite("error! read before raw_data buffer.\n");
- octet = 0;
- }
-
- dec_len--;
- if (dec_len == 0) {
- // back to normal mode
- dec_prefix = 0;
- }
-
- break;
-
-
- // normal mode
- default:
- octet = blk.mb_data [block_pos++];
- if (octet == 155 || octet == 175) {
- // it's a prefix, restart
- dec_prefix = octet;
- continue;
- }
- } // prefix switch
-
-
- // output the octet
- if (output != NULL)
- *output = octet;
-
- raw_data [raw_pos++] = octet;
- break;
- }; // decode pass
-
- return true;
-}
diff --git a/src/adplug/core/msc.h b/src/adplug/core/msc.h
deleted file mode 100644
index b6cf6ec..0000000
--- a/src/adplug/core/msc.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * msc.h - MSC Player by Lubomir Bulej (pallas@kadan.cz)
- */
-
-#include "player.h"
-
-#define MSC_SIGN_LEN 16
-#define MSC_DESC_LEN 64
-
-class CmscPlayer: public CPlayer
-{
- public:
- static CPlayer * factory(Copl * newopl);
-
- CmscPlayer(Copl * newopl);
- ~CmscPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype ();
-
- protected:
- typedef unsigned char u8;
- typedef unsigned short u16;
-
- struct msc_header {
- u8 mh_sign [MSC_SIGN_LEN];
- u16 mh_ver;
- u8 mh_desc [MSC_DESC_LEN];
- u16 mh_timer;
- u16 mh_nr_blocks;
- u16 mh_block_len;
- };
-
- struct msc_block {
- u16 mb_length;
- u8 * mb_data;
- };
-
- // file data
- char * desc; // song desctiption
- unsigned short version; // file version
- unsigned short nr_blocks; // number of music blocks
- unsigned short block_len; // maximal block length
- unsigned short timer_div; // timer divisor
- msc_block * msc_data; // compressed music data
-
- // decoder state
- unsigned long block_num; // active block
- unsigned long block_pos; // position in block
- unsigned long raw_pos; // position in data buffer
- u8 * raw_data; // decompression buffer
-
- u8 dec_prefix; // prefix / state
- int dec_dist; // prefix distance
- unsigned int dec_len; // prefix length
-
- // player state
- unsigned char delay; // active delay
- unsigned long play_pos; // player position
-
- private:
- static const u8 msc_signature [MSC_SIGN_LEN];
-
- bool load_header (binistream * bf, msc_header * hdr);
- bool decode_octet (u8 * output);
-};
diff --git a/src/adplug/core/mtk.cc b/src/adplug/core/mtk.cc
deleted file mode 100644
index 4f08f96..0000000
--- a/src/adplug/core/mtk.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * mtk.cpp - MPU-401 Trakker Loader by Simon Peter (dn.tlp@gmx.net)
- */
-
-#include <cstring>
-#include "mtk.h"
-
-/*** public methods **************************************/
-
-CPlayer *CmtkLoader::factory(Copl *newopl)
-{
- return new CmtkLoader(newopl);
-}
-
-bool CmtkLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- struct {
- char id[18];
- unsigned short crc,size;
- } header;
- struct mtkdata {
- char songname[34],composername[34],instname[0x80][34];
- unsigned char insts[0x80][12],order[0x80],dummy,patterns[0x32][0x40][9];
- } *data;
- unsigned char *cmp,*org;
- unsigned int i;
- unsigned long cmpsize,cmpptr=0,orgptr=0;
- unsigned short ctrlbits=0,ctrlmask=0,cmd,cnt,offs;
-
- // read header
- f->readString(header.id, 18);
- header.crc = f->readInt(2);
- header.size = f->readInt(2);
-
- // file validation section
- if(strncmp(header.id,"mpu401tr\x92kk\xeer@data",18))
- { fp.close(f); return false; }
-
- // load section
- cmpsize = fp.filesize(f) - 22;
- cmp = new unsigned char[cmpsize];
- org = new unsigned char[header.size];
- for(i = 0; i < cmpsize; i++) cmp[i] = f->readInt(1);
- fp.close(f);
-
- while(cmpptr < cmpsize) { // decompress
- ctrlmask >>= 1;
- if(!ctrlmask) {
- ctrlbits = cmp[cmpptr] + (cmp[cmpptr + 1] << 8);
- cmpptr += 2;
- ctrlmask = 0x8000;
- }
- if(!(ctrlbits & ctrlmask)) { // uncompressed data
- if(orgptr >= header.size)
- goto err;
-
- org[orgptr] = cmp[cmpptr];
- orgptr++; cmpptr++;
- continue;
- }
-
- // compressed data
- cmd = (cmp[cmpptr] >> 4) & 0x0f;
- cnt = cmp[cmpptr] & 0x0f;
- cmpptr++;
- switch(cmd) {
- case 0:
- if(orgptr + cnt > header.size) goto err;
- cnt += 3;
- memset(&org[orgptr],cmp[cmpptr],cnt);
- cmpptr++; orgptr += cnt;
- break;
-
- case 1:
- if(orgptr + cnt > header.size) goto err;
- cnt += (cmp[cmpptr] << 4) + 19;
- memset(&org[orgptr],cmp[++cmpptr],cnt);
- cmpptr++; orgptr += cnt;
- break;
-
- case 2:
- if(orgptr + cnt > header.size) goto err;
- offs = (cnt+3) + (cmp[cmpptr] << 4);
- cnt = cmp[++cmpptr] + 16; cmpptr++;
- memcpy(&org[orgptr],&org[orgptr - offs],cnt);
- orgptr += cnt;
- break;
-
- default:
- if(orgptr + cmd > header.size) goto err;
- offs = (cnt+3) + (cmp[cmpptr++] << 4);
- memcpy(&org[orgptr],&org[orgptr-offs],cmd);
- orgptr += cmd;
- break;
- }
- }
- delete [] cmp;
- data = (struct mtkdata *) org;
-
- // convert to HSC replay data
- memset(title,0,34); strncpy(title,data->songname+1,33);
- memset(composer,0,34); strncpy(composer,data->composername+1,33);
- memset(instname,0,0x80*34);
- for(i=0;i<0x80;i++)
- strncpy(instname[i],data->instname[i]+1,33);
- memcpy(instr,data->insts,0x80 * 12);
- memcpy(song,data->order,0x80);
- memcpy(patterns,data->patterns,header.size-6084);
- for (i=0;i<128;i++) { // correct instruments
- instr[i][2] ^= (instr[i][2] & 0x40) << 1;
- instr[i][3] ^= (instr[i][3] & 0x40) << 1;
- instr[i][11] >>= 4; // make unsigned
- }
-
- delete [] org;
- rewind(0);
- return true;
-
- err:
- delete [] cmp;
- delete [] org;
- return false;
-}
diff --git a/src/adplug/core/mtk.h b/src/adplug/core/mtk.h
deleted file mode 100644
index b38f916..0000000
--- a/src/adplug/core/mtk.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * mtk.h - MPU-401 Trakker Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "hsc.h"
-
-class CmtkLoader: public ChscPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CmtkLoader(Copl *newopl)
- : ChscPlayer(newopl)
- {
- mtkmode = 1;
- };
-
- bool load(const std::string &filename, const CFileProvider &fp);
-
- std::string gettype()
- { return std::string("MPU-401 Trakker"); };
- std::string gettitle()
- { return std::string(title); };
- std::string getauthor()
- { return std::string(composer); };
- unsigned int getinstruments()
- { return 128; };
- std::string getinstrument(unsigned int n)
- { return std::string(instname[n]); };
-
- private:
- char title[34],composer[34],instname[0x80][34];
-};
diff --git a/src/adplug/core/opl.h b/src/adplug/core/opl.h
deleted file mode 100644
index 18a26a3..0000000
--- a/src/adplug/core/opl.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * opl.h - OPL base class, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_OPL
-#define H_ADPLUG_OPL
-
-class Copl
-{
- public:
- typedef enum {
- TYPE_OPL2, TYPE_OPL3, TYPE_DUAL_OPL2
- } ChipType;
-
- Copl()
- : currChip(0), currType(TYPE_OPL2)
- {
- }
-
- virtual ~Copl()
- {
- }
-
- virtual void write(int reg, int val) = 0; // combined register select + data write
- virtual void setchip(int n) // select OPL chip
- {
- if(n < 2)
- currChip = n;
- }
-
- virtual int getchip() // returns current OPL chip
- {
- return currChip;
- }
-
- virtual void init() = 0; // reinitialize OPL chip(s)
-
- // return this OPL chip's type
- ChipType gettype()
- {
- return currType;
- }
-
- // Emulation only: fill buffer
- virtual void update(short *buf, int samples) {}
-
- protected:
- int currChip; // currently selected OPL chip number
- ChipType currType; // this OPL chip's type
-};
-
-#endif
diff --git a/src/adplug/core/player.cc b/src/adplug/core/player.cc
deleted file mode 100644
index 3545a72..0000000
--- a/src/adplug/core/player.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * player.cpp - Replayer base class, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-#include "adplug.h"
-#include "silentopl.h"
-
-/***** CPlayer *****/
-
-const unsigned short CPlayer::note_table[12] =
- {363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647, 686};
-
-const unsigned char CPlayer::op_table[9] =
- {0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12};
-
-CPlayer::CPlayer(Copl *newopl)
- : opl(newopl), db(CAdPlug::database)
-{
-}
-
-CPlayer::~CPlayer()
-{
-}
-
-unsigned long CPlayer::songlength(int subsong)
-{
- CSilentopl tempopl;
- Copl *saveopl = opl;
- float slength = 0.0f;
-
- // save original OPL from being overwritten
- opl = &tempopl;
-
- // get song length
- rewind(subsong);
- while(update() && slength < 600000) // song length limit: 10 minutes
- slength += 1000.0f / getrefresh();
- rewind(subsong);
-
- // restore original OPL and return
- opl = saveopl;
- return (unsigned long)slength;
-}
-
-void CPlayer::seek(unsigned long ms)
-{
- float pos = 0.0f;
-
- rewind();
- while(pos < ms && update()) // seek to new position
- pos += 1000/getrefresh();
-}
diff --git a/src/adplug/core/player.h b/src/adplug/core/player.h
deleted file mode 100644
index 4fb05cb..0000000
--- a/src/adplug/core/player.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * player.h - Replayer base class, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_PLAYER
-#define H_ADPLUG_PLAYER
-
-#include <string>
-
-#include "fprovide.h"
-#include "opl.h"
-#include "database.h"
-
-class CPlayer
-{
-public:
- CPlayer(Copl *newopl);
- virtual ~CPlayer();
-
-/***** Operational methods *****/
- void seek(unsigned long ms);
-
- virtual bool load(const std::string &filename, // loads file
- const CFileProvider &fp) = 0;
- virtual bool update() = 0; // executes replay code for 1 tick
- virtual void rewind(int subsong = -1) = 0; // rewinds to specified subsong
- virtual float getrefresh() = 0; // returns needed timer refresh rate
-
-/***** Informational methods *****/
- unsigned long songlength(int subsong = -1);
-
- virtual std::string gettype() = 0; // returns file type
- virtual std::string gettitle() // returns song title
- { return std::string(); }
- virtual std::string getauthor() // returns song author name
- { return std::string(); }
- virtual std::string getdesc() // returns song description
- { return std::string(); }
- virtual unsigned int getpatterns() // returns number of patterns
- { return 0; }
- virtual unsigned int getpattern() // returns currently playing pattern
- { return 0; }
- virtual unsigned int getorders() // returns size of orderlist
- { return 0; }
- virtual unsigned int getorder() // returns currently playing song position
- { return 0; }
- virtual unsigned int getrow() // returns currently playing row
- { return 0; }
- virtual unsigned int getspeed() // returns current song speed
- { return 0; }
- virtual unsigned int getsubsongs() // returns number of subsongs
- { return 1; }
- virtual unsigned int getsubsong() // returns current subsong
- { return 0; }
- virtual unsigned int getinstruments() // returns number of instruments
- { return 0; }
- virtual std::string getinstrument(unsigned int n) // returns n-th instrument name
- { return std::string(); }
-
-protected:
- Copl *opl; // our OPL chip
- CAdPlugDatabase *db; // AdPlug Database
-
- static const unsigned short note_table[12]; // standard adlib note table
- static const unsigned char op_table[9]; // the 9 operators as expected by the OPL
-};
-
-#endif
diff --git a/src/adplug/core/players.cc b/src/adplug/core/players.cc
deleted file mode 100644
index f15c5c3..0000000
--- a/src/adplug/core/players.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * players.h - Players enumeration, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "players.h"
-
-/***** CPlayerDesc *****/
-
-CPlayerDesc::CPlayerDesc()
- : factory(0), extensions(0), extlength(0)
-{
-}
-
-CPlayerDesc::CPlayerDesc(const CPlayerDesc &pd)
- : factory(pd.factory), filetype(pd.filetype), extlength(pd.extlength)
-{
- if(pd.extensions) {
- extensions = (char *)malloc(extlength);
- memcpy(extensions, pd.extensions, extlength);
- } else
- extensions = 0;
-}
-
-CPlayerDesc::CPlayerDesc(Factory f, const std::string &type, const char *ext)
- : factory(f), filetype(type), extensions(0)
-{
- const char *i = ext;
-
- // Determine length of passed extensions list
- while(*i) i += strlen(i) + 1;
- extlength = i - ext + 1; // length = difference between last and first char + 1
-
- extensions = (char *)malloc(extlength);
- memcpy(extensions, ext, extlength);
-}
-
-CPlayerDesc::~CPlayerDesc()
-{
- if(extensions) free(extensions);
-}
-
-void CPlayerDesc::add_extension(const char *ext)
-{
- unsigned long newlength = extlength + strlen(ext) + 1;
-
- extensions = (char *)realloc(extensions, newlength);
- strcpy(extensions + extlength - 1, ext);
- extensions[newlength - 1] = '\0';
- extlength = newlength;
-}
-
-const char *CPlayerDesc::get_extension(unsigned int n) const
-{
- const char *i = extensions;
- unsigned int j;
-
- for(j = 0; j < n && (*i); j++, i += strlen(i) + 1) ;
- return (*i != '\0' ? i : 0);
-}
-
-/***** CPlayers *****/
-
-const CPlayerDesc *CPlayers::lookup_filetype(const std::string &ftype) const
-{
- const_iterator i;
-
- for(i = begin(); i != end(); i++)
- if((*i)->filetype == ftype)
- return *i;
-
- return 0;
-}
-
-const CPlayerDesc *CPlayers::lookup_extension(const std::string &extension) const
-{
- const_iterator i;
- unsigned int j;
-
- for(i = begin(); i != end(); i++)
- for(j = 0; (*i)->get_extension(j); j++)
- if(!strcasecmp(extension.c_str(), (*i)->get_extension(j)))
- return *i;
-
- return 0;
-}
diff --git a/src/adplug/core/players.h b/src/adplug/core/players.h
deleted file mode 100644
index 686c20b..0000000
--- a/src/adplug/core/players.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * players.h - Players enumeration, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_PLAYERS
-#define H_ADPLUG_PLAYERS
-
-#include <string>
-#include <list>
-
-#include "opl.h"
-#include "player.h"
-
-class CPlayerDesc
-{
-public:
- typedef CPlayer *(*Factory)(Copl *);
-
- Factory factory;
- std::string filetype;
-
- CPlayerDesc();
- CPlayerDesc(const CPlayerDesc &pd);
- CPlayerDesc(Factory f, const std::string &type, const char *ext);
-
- ~CPlayerDesc();
-
- void add_extension(const char *ext);
- const char *get_extension(unsigned int n) const;
-
-private:
- char *extensions;
- unsigned long extlength;
-};
-
-class CPlayers: public std::list<const CPlayerDesc *>
-{
-public:
- const CPlayerDesc *lookup_filetype(const std::string &ftype) const;
- const CPlayerDesc *lookup_extension(const std::string &extension) const;
-};
-
-#endif
diff --git a/src/adplug/core/protrack.cc b/src/adplug/core/protrack.cc
deleted file mode 100644
index cb6da57..0000000
--- a/src/adplug/core/protrack.cc
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * protrack.cpp - Generic Protracker Player
- *
- * NOTES:
- * This is a generic Protracker-based formats player. It offers all Protracker
- * features, plus a good set of extensions to be compatible to other Protracker
- * derivatives. It is derived from the former SA2 player. If you got a
- * Protracker-like format, this is most certainly the player you want to use.
- */
-
-#include <cstring>
-#include "protrack.h"
-#include "debug.h"
-
-#define SPECIALARPLEN 256 // Standard length of special arpeggio lists
-#define JUMPMARKER 0x80 // Orderlist jump marker
-
-// SA2 compatible adlib note table
-const unsigned short CmodPlayer::sa2_notetable[12] =
- {340,363,385,408,432,458,485,514,544,577,611,647};
-
-// SA2 compatible vibrato rate table
-const unsigned char CmodPlayer::vibratotab[32] =
- {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
-
-/*** public methods *************************************/
-
-CmodPlayer::CmodPlayer(Copl *newopl)
- : CPlayer(newopl), inst(0), order(0), arplist(0), arpcmd(0), initspeed(6),
- nop(0), activechan(0xffffffff), flags(Standard), curchip(opl->getchip()),
- nrows(0), npats(0), nchans(0)
-{
- realloc_order(128);
- realloc_patterns(64, 64, 9);
- realloc_instruments(250);
- init_notetable(sa2_notetable);
-}
-
-CmodPlayer::~CmodPlayer()
-{
- dealloc();
-}
-
-bool CmodPlayer::update()
-{
- unsigned char pattbreak=0, donote, pattnr, chan, oplchan, info1,
- info2, info, pattern_delay;
- unsigned short track;
- unsigned long row;
-
- if(!speed) // song full stop
- return !songend;
-
- // effect handling (timer dependant)
- for(chan = 0; chan < nchans; chan++) {
- oplchan = set_opl_chip(chan);
-
- if(arplist && arpcmd && inst[channel[chan].inst].arpstart) { // special arpeggio
- if(channel[chan].arpspdcnt)
- channel[chan].arpspdcnt--;
- else
- if(arpcmd[channel[chan].arppos] != 255) {
- switch(arpcmd[channel[chan].arppos]) {
- case 252: channel[chan].vol1 = arplist[channel[chan].arppos]; // set volume
- if(channel[chan].vol1 > 63) // ?????
- channel[chan].vol1 = 63;
- channel[chan].vol2 = channel[chan].vol1;
- setvolume(chan);
- break;
- case 253: channel[chan].key = 0; setfreq(chan); break; // release sustaining note
- case 254: channel[chan].arppos = arplist[channel[chan].arppos]; break; // arpeggio loop
- default: if(arpcmd[channel[chan].arppos]) {
- if(arpcmd[channel[chan].arppos] / 10)
- opl->write(0xe3 + op_table[oplchan], arpcmd[channel[chan].arppos] / 10 - 1);
- if(arpcmd[channel[chan].arppos] % 10)
- opl->write(0xe0 + op_table[oplchan], (arpcmd[channel[chan].arppos] % 10) - 1);
- if(arpcmd[channel[chan].arppos] < 10) // ?????
- opl->write(0xe0 + op_table[oplchan], arpcmd[channel[chan].arppos] - 1);
- }
- }
- if(arpcmd[channel[chan].arppos] != 252) {
- if(arplist[channel[chan].arppos] <= 96)
- setnote(chan,channel[chan].note + arplist[channel[chan].arppos]);
- if(arplist[channel[chan].arppos] >= 100)
- setnote(chan,arplist[channel[chan].arppos] - 100);
- } else
- setnote(chan,channel[chan].note);
- setfreq(chan);
- if(arpcmd[channel[chan].arppos] != 255)
- channel[chan].arppos++;
- channel[chan].arpspdcnt = inst[channel[chan].inst].arpspeed - 1;
- }
- }
-
- info1 = channel[chan].info1;
- info2 = channel[chan].info2;
- if(flags & Decimal)
- info = channel[chan].info1 * 10 + channel[chan].info2;
- else
- info = (channel[chan].info1 << 4) + channel[chan].info2;
- switch(channel[chan].fx) {
- case 0: if(info) { // arpeggio
- if(channel[chan].trigger < 2)
- channel[chan].trigger++;
- else
- channel[chan].trigger = 0;
- switch(channel[chan].trigger) {
- case 0: setnote(chan,channel[chan].note); break;
- case 1: setnote(chan,channel[chan].note + info1); break;
- case 2: setnote(chan,channel[chan].note + info2);
- }
- setfreq(chan);
- }
- break;
- case 1: slide_up(chan,info); setfreq(chan); break; // slide up
- case 2: slide_down(chan,info); setfreq(chan); break; // slide down
- case 3: tone_portamento(chan,channel[chan].portainfo); break; // tone portamento
- case 4: vibrato(chan,channel[chan].vibinfo1,channel[chan].vibinfo2); break; // vibrato
- case 5: // tone portamento & volume slide
- case 6: if(channel[chan].fx == 5) // vibrato & volume slide
- tone_portamento(chan,channel[chan].portainfo);
- else
- vibrato(chan,channel[chan].vibinfo1,channel[chan].vibinfo2);
- case 10:
- if(del % 4) // SA2 volume slide
- break;
- if(info1)
- vol_up(chan,info1);
- else
- vol_down(chan,info2);
- setvolume(chan);
- break;
- case 14:
- if(info1 == 3) // retrig note
- if(!(del % (info2+1)))
- playnote(chan);
- break;
- case 16:
- if(del % 4) // AMD volume slide
- break;
- if(info1)
- vol_up_alt(chan,info1);
- else
- vol_down_alt(chan,info2);
- setvolume(chan);
- break;
- case 20: // RAD volume slide
- if(info < 50)
- vol_down_alt(chan,info);
- else
- vol_up_alt(chan,info - 50);
- setvolume(chan);
- break;
- case 26: // volume slide
- if(info1)
- vol_up(chan,info1);
- else
- vol_down(chan,info2);
- setvolume(chan);
- break;
- case 28:
- if (info1) {
- slide_up(chan,1); channel[chan].info1--;
- }
- if (info2) {
- slide_down(chan,1); channel[chan].info2--;
- }
- setfreq(chan);
- break;
- }
- }
-
- if(del) { // speed compensation
- del--;
- return !songend;
- }
-
- // arrangement handling
- if(!resolve_order()) return !songend;
- pattnr = order[ord];
-
- if(!rw) AdPlug_LogWrite("\nCmodPlayer::update(): Pattern: %d, Order: %lu\n", pattnr, ord);
- AdPlug_LogWrite("CmodPlayer::update():%3lu|", rw);
-
- // play row
- pattern_delay = 0;
- row = rw;
- for(chan = 0; chan < nchans; chan++) {
- oplchan = set_opl_chip(chan);
-
- if(!((activechan >> (31 - chan)) & 1)) { // channel active?
- AdPlug_LogWrite("N/A|");
- continue;
- }
- if(!(track = trackord[pattnr][chan])) { // resolve track
- AdPlug_LogWrite("------------|");
- continue;
- } else
- track--;
-
- AdPlug_LogWrite("%3d%3d%2X%2X%2X|", tracks[track][row].note,
- tracks[track][row].inst, tracks[track][row].command,
- tracks[track][row].param1, tracks[track][row].param2);
-
- donote = 0;
- if(tracks[track][row].inst) {
- channel[chan].inst = tracks[track][row].inst - 1;
- if (!(flags & Faust)) {
- channel[chan].vol1 = 63 - (inst[channel[chan].inst].data[10] & 63);
- channel[chan].vol2 = 63 - (inst[channel[chan].inst].data[9] & 63);
- setvolume(chan);
- }
- }
-
- if(tracks[track][row].note && tracks[track][row].command != 3) { // no tone portamento
- channel[chan].note = tracks[track][row].note;
- setnote(chan,tracks[track][row].note);
- channel[chan].nextfreq = channel[chan].freq;
- channel[chan].nextoct = channel[chan].oct;
- channel[chan].arppos = inst[channel[chan].inst].arpstart;
- channel[chan].arpspdcnt = 0;
- if(tracks[track][row].note != 127) // handle key off
- donote = 1;
- }
- channel[chan].fx = tracks[track][row].command;
- channel[chan].info1 = tracks[track][row].param1;
- channel[chan].info2 = tracks[track][row].param2;
-
- if(donote)
- playnote(chan);
-
- // command handling (row dependant)
- info1 = channel[chan].info1;
- info2 = channel[chan].info2;
- if(flags & Decimal)
- info = channel[chan].info1 * 10 + channel[chan].info2;
- else
- info = (channel[chan].info1 << 4) + channel[chan].info2;
- switch(channel[chan].fx) {
- case 3: // tone portamento
- if(tracks[track][row].note) {
- if(tracks[track][row].note < 13)
- channel[chan].nextfreq = notetable[tracks[track][row].note - 1];
- else
- if(tracks[track][row].note % 12 > 0)
- channel[chan].nextfreq = notetable[(tracks[track][row].note % 12) - 1];
- else
- channel[chan].nextfreq = notetable[11];
- channel[chan].nextoct = (tracks[track][row].note - 1) / 12;
- if(tracks[track][row].note == 127) { // handle key off
- channel[chan].nextfreq = channel[chan].freq;
- channel[chan].nextoct = channel[chan].oct;
- }
- }
- if(info) // remember vars
- channel[chan].portainfo = info;
- break;
-
- case 4: // vibrato (remember vars)
- if(info) {
- channel[chan].vibinfo1 = info1;
- channel[chan].vibinfo2 = info2;
- }
- break;
-
- case 7: tempo = info; break; // set tempo
-
- case 8: channel[chan].key = 0; setfreq(chan); break; // release sustaining note
-
- case 9: // set carrier/modulator volume
- if(info1)
- channel[chan].vol1 = info1 * 7;
- else
- channel[chan].vol2 = info2 * 7;
- setvolume(chan);
- break;
-
- case 11: // position jump
- pattbreak = 1; rw = 0; if(info < ord) songend = 1; ord = info; break;
-
- case 12: // set volume
- channel[chan].vol1 = info;
- channel[chan].vol2 = info;
- if(channel[chan].vol1 > 63)
- channel[chan].vol1 = 63;
- if(channel[chan].vol2 > 63)
- channel[chan].vol2 = 63;
- setvolume(chan);
- break;
-
- case 13: // pattern break
- if(!pattbreak) { pattbreak = 1; rw = info; ord++; } break;
-
- case 14: // extended command
- switch(info1) {
- case 0: // define cell-tremolo
- if(info2)
- regbd |= 128;
- else
- regbd &= 127;
- opl->write(0xbd,regbd);
- break;
-
- case 1: // define cell-vibrato
- if(info2)
- regbd |= 64;
- else
- regbd &= 191;
- opl->write(0xbd,regbd);
- break;
-
- case 4: // increase volume fine
- vol_up_alt(chan,info2);
- setvolume(chan);
- break;
-
- case 5: // decrease volume fine
- vol_down_alt(chan,info2);
- setvolume(chan);
- break;
-
- case 6: // manual slide up
- slide_up(chan,info2);
- setfreq(chan);
- break;
-
- case 7: // manual slide down
- slide_down(chan,info2);
- setfreq(chan);
- break;
-
- case 8: // pattern delay (rows)
- pattern_delay = info2 * speed;
- break;
- }
- break;
-
- case 15: // SA2 set speed
- if(info <= 0x1f)
- speed = info;
- if(info >= 0x32)
- tempo = info;
- if(!info)
- songend = 1;
- break;
-
- case 17: // alternate set volume
- channel[chan].vol1 = info;
- if(channel[chan].vol1 > 63)
- channel[chan].vol1 = 63;
- if(inst[channel[chan].inst].data[0] & 1) {
- channel[chan].vol2 = info;
- if(channel[chan].vol2 > 63)
- channel[chan].vol2 = 63;
- }
-
- setvolume(chan);
- break;
-
- case 18: // AMD set speed
- if(info <= 31 && info > 0)
- speed = info;
- if(info > 31 || !info)
- tempo = info;
- break;
-
- case 19: // RAD/A2M set speed
- speed = (info ? info : info + 1);
- break;
-
- case 21: // set modulator volume
- if(info <= 63)
- channel[chan].vol2 = info;
- else
- channel[chan].vol2 = 63;
- setvolume(chan);
- break;
-
- case 22: // set carrier volume
- if(info <= 63)
- channel[chan].vol1 = info;
- else
- channel[chan].vol1 = 63;
- setvolume(chan);
- break;
-
- case 23: // fine frequency slide up
- slide_up(chan,info);
- setfreq(chan);
- break;
-
- case 24: // fine frequency slide down
- slide_down(chan,info);
- setfreq(chan);
- break;
-
- case 25: // set carrier/modulator waveform
- if(info1 != 0x0f)
- opl->write(0xe3 + op_table[oplchan],info1);
- if(info2 != 0x0f)
- opl->write(0xe0 + op_table[oplchan],info2);
- break;
-
- case 27: // set chip tremolo/vibrato
- if(info1)
- regbd |= 128;
- else
- regbd &= 127;
- if(info2)
- regbd |= 64;
- else
- regbd &= 191;
- opl->write(0xbd,regbd);
- break;
-
- case 29: // pattern delay (frames)
- pattern_delay = info;
- break;
- }
- }
-
- // speed compensation
- del = speed - 1 + pattern_delay;
-
- if(!pattbreak) { // next row (only if no manual advance)
- rw++;
- if(rw >= nrows) {
- rw = 0;
- ord++;
- }
- }
-
- resolve_order(); // so we can report songend right away
- AdPlug_LogWrite("\n");
- return !songend;
-}
-
-unsigned char CmodPlayer::set_opl_chip(unsigned char chan)
- /*
- * Sets OPL chip according to channel number. Channels 0-8 are on first chip,
- * channels 9-17 are on second chip. Returns corresponding OPL channel
- * number.
- */
-{
- int newchip = chan < 9 ? 0 : 1;
-
- if(newchip != curchip) {
- opl->setchip(newchip);
- curchip = newchip;
- }
-
- return chan % 9;
-}
-
-bool CmodPlayer::resolve_order()
- /*
- * Resolves current orderlist entry, checking for jumps and loops.
- *
- * Returns true on correct processing, false if immediate recursive loop
- * has been detected.
- */
-{
- if(ord < length) {
- while(order[ord] >= JUMPMARKER) { // jump to order
- unsigned long neword = order[ord] - JUMPMARKER;
-
- if(neword <= ord) songend = 1;
- if(neword == ord) return false;
- ord = neword;
- }
- } else {
- songend = 1;
- ord = restartpos;
- }
-
- return true;
-}
-
-void CmodPlayer::rewind(int subsong)
-{
- unsigned long i;
-
- // Reset playing variables
- songend = del = ord = rw = regbd = 0;
- tempo = bpm; speed = initspeed;
-
- // Reset channel data
- memset(channel,0,sizeof(Channel)*nchans);
-
- // Compute number of patterns, if needed
- if(!nop)
- for(i=0;i<length;i++)
- nop = (order[i] > nop ? order[i] : nop);
-
- opl->init(); // Reset OPL chip
- opl->write(1, 32); // Go to ym3812 mode
-
- // Enable OPL3 extensions if flagged
- if(flags & Opl3) {
- opl->setchip(1);
- opl->write(1, 32);
- opl->write(5, 1);
- opl->setchip(0);
- }
-
- // Enable tremolo/vibrato depth if flagged
- if(flags & Tremolo) regbd |= 128;
- if(flags & Vibrato) regbd |= 64;
- if(regbd) opl->write(0xbd, regbd);
-}
-
-float CmodPlayer::getrefresh()
-{
- return (float) (tempo / 2.5);
-}
-
-void CmodPlayer::init_trackord()
-{
- unsigned long i;
-
- for(i=0;i<npats*nchans;i++)
- trackord[i / nchans][i % nchans] = i + 1;
-}
-
-bool CmodPlayer::init_specialarp()
-{
- arplist = new unsigned char[SPECIALARPLEN];
- arpcmd = new unsigned char[SPECIALARPLEN];
-
- return true;
-}
-
-void CmodPlayer::init_notetable(const unsigned short *newnotetable)
-{
- memcpy(notetable, newnotetable, 12 * 2);
-}
-
-bool CmodPlayer::realloc_order(unsigned long len)
-{
- if(order) delete [] order;
- order = new unsigned char[len];
- return true;
-}
-
-bool CmodPlayer::realloc_patterns(unsigned long pats, unsigned long rows, unsigned long chans)
-{
- unsigned long i;
-
- dealloc_patterns();
-
- // set new number of tracks, rows and channels
- npats = pats; nrows = rows; nchans = chans;
-
- // alloc new patterns
- tracks = new Tracks *[pats * chans];
- for(i=0;i<pats*chans;i++) tracks[i] = new Tracks[rows];
- trackord = new unsigned short *[pats];
- for(i=0;i<pats;i++) trackord[i] = new unsigned short[chans];
- channel = new Channel[chans];
-
- // initialize new patterns
- for(i=0;i<pats*chans;i++) memset(tracks[i],0,sizeof(Tracks)*rows);
- for(i=0;i<pats;i++) memset(trackord[i],0,chans*2);
-
- return true;
-}
-
-void CmodPlayer::dealloc_patterns()
-{
- unsigned long i;
-
- // dealloc everything previously allocated
- if(npats && nrows && nchans) {
- for(i=0;i<npats*nchans;i++) delete [] tracks[i];
- delete [] tracks;
- for(i=0;i<npats;i++) delete [] trackord[i];
- delete [] trackord;
- delete [] channel;
- }
-}
-
-bool CmodPlayer::realloc_instruments(unsigned long len)
-{
- // dealloc previous instance, if any
- if(inst) delete [] inst;
-
- inst = new Instrument[len];
- memset(inst,0,sizeof(Instrument)*len); // reset instruments
- return true;
-}
-
-void CmodPlayer::dealloc()
-{
- if(inst) delete [] inst;
- if(order) delete [] order;
- if(arplist) delete [] arplist;
- if(arpcmd) delete [] arpcmd;
- dealloc_patterns();
-}
-
-/*** private methods *************************************/
-
-void CmodPlayer::setvolume(unsigned char chan)
-{
- unsigned char oplchan = set_opl_chip(chan);
-
- if(flags & Faust)
- setvolume_alt(chan);
- else {
- opl->write(0x40 + op_table[oplchan], 63-channel[chan].vol2 + (inst[channel[chan].inst].data[9] & 192));
- opl->write(0x43 + op_table[oplchan], 63-channel[chan].vol1 + (inst[channel[chan].inst].data[10] & 192));
- }
-}
-
-void CmodPlayer::setvolume_alt(unsigned char chan)
-{
- unsigned char oplchan = set_opl_chip(chan);
- unsigned char ivol2 = inst[channel[chan].inst].data[9] & 63;
- unsigned char ivol1 = inst[channel[chan].inst].data[10] & 63;
-
- opl->write(0x40 + op_table[oplchan], (((63 - (channel[chan].vol2 & 63)) + ivol2) >> 1) + (inst[channel[chan].inst].data[9] & 192));
- opl->write(0x43 + op_table[oplchan], (((63 - (channel[chan].vol1 & 63)) + ivol1) >> 1) + (inst[channel[chan].inst].data[10] & 192));
-}
-
-void CmodPlayer::setfreq(unsigned char chan)
-{
- unsigned char oplchan = set_opl_chip(chan);
-
- opl->write(0xa0 + oplchan, channel[chan].freq & 255);
- if(channel[chan].key)
- opl->write(0xb0 + oplchan, ((channel[chan].freq & 768) >> 8) + ((channel[chan].oct << 2) | 32));
- else
- opl->write(0xb0 + oplchan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2));
-}
-
-void CmodPlayer::playnote(unsigned char chan)
-{
- unsigned char oplchan = set_opl_chip(chan);
- unsigned char op = op_table[oplchan], insnr = channel[chan].inst;
-
- if(!(flags & NoKeyOn))
- opl->write(0xb0 + oplchan, 0); // stop old note
-
- // set instrument data
- opl->write(0x20 + op, inst[insnr].data[1]);
- opl->write(0x23 + op, inst[insnr].data[2]);
- opl->write(0x60 + op, inst[insnr].data[3]);
- opl->write(0x63 + op, inst[insnr].data[4]);
- opl->write(0x80 + op, inst[insnr].data[5]);
- opl->write(0x83 + op, inst[insnr].data[6]);
- opl->write(0xe0 + op, inst[insnr].data[7]);
- opl->write(0xe3 + op, inst[insnr].data[8]);
- opl->write(0xc0 + oplchan, inst[insnr].data[0]);
- opl->write(0xbd, inst[insnr].misc); // set misc. register
-
- // set frequency, volume & play
- channel[chan].key = 1;
- setfreq(chan);
-
- if (flags & Faust) {
- channel[chan].vol2 = 63;
- channel[chan].vol1 = 63;
- }
- setvolume(chan);
-}
-
-void CmodPlayer::setnote(unsigned char chan, int note)
-{
- if(note > 96) {
- if(note == 127) { // key off
- channel[chan].key = 0;
- setfreq(chan);
- return;
- } else
- note = 96;
- }
-
- if(note < 13)
- channel[chan].freq = notetable[note - 1];
- else
- if(note % 12 > 0)
- channel[chan].freq = notetable[(note % 12) - 1];
- else
- channel[chan].freq = notetable[11];
- channel[chan].oct = (note - 1) / 12;
- channel[chan].freq += inst[channel[chan].inst].slide; // apply pre-slide
-}
-
-void CmodPlayer::slide_down(unsigned char chan, int amount)
-{
- channel[chan].freq -= amount;
- if(channel[chan].freq <= 342) {
- if(channel[chan].oct) {
- channel[chan].oct--;
- channel[chan].freq <<= 1;
- } else
- channel[chan].freq = 342;
- }
-}
-
-void CmodPlayer::slide_up(unsigned char chan, int amount)
-{
- channel[chan].freq += amount;
- if(channel[chan].freq >= 686) {
- if(channel[chan].oct < 7) {
- channel[chan].oct++;
- channel[chan].freq >>= 1;
- } else
- channel[chan].freq = 686;
- }
-}
-
-void CmodPlayer::tone_portamento(unsigned char chan, unsigned char info)
-{
- if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq +
- (channel[chan].nextoct << 10)) {
- slide_up(chan,info);
- if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq +
- (channel[chan].nextoct << 10)) {
- channel[chan].freq = channel[chan].nextfreq;
- channel[chan].oct = channel[chan].nextoct;
- }
- }
- if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq +
- (channel[chan].nextoct << 10)) {
- slide_down(chan,info);
- if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq +
- (channel[chan].nextoct << 10)) {
- channel[chan].freq = channel[chan].nextfreq;
- channel[chan].oct = channel[chan].nextoct;
- }
- }
- setfreq(chan);
-}
-
-void CmodPlayer::vibrato(unsigned char chan, unsigned char speed, unsigned char depth)
-{
- int i;
-
- if(!speed || !depth)
- return;
-
- if(depth > 14)
- depth = 14;
-
- for(i=0;i<speed;i++) {
- channel[chan].trigger++;
- while(channel[chan].trigger >= 64)
- channel[chan].trigger -= 64;
- if(channel[chan].trigger >= 16 && channel[chan].trigger < 48)
- slide_down(chan,vibratotab[channel[chan].trigger - 16] / (16-depth));
- if(channel[chan].trigger < 16)
- slide_up(chan,vibratotab[channel[chan].trigger + 16] / (16-depth));
- if(channel[chan].trigger >= 48)
- slide_up(chan,vibratotab[channel[chan].trigger - 48] / (16-depth));
- }
- setfreq(chan);
-}
-
-void CmodPlayer::vol_up(unsigned char chan, int amount)
-{
- if(channel[chan].vol1 + amount < 63)
- channel[chan].vol1 += amount;
- else
- channel[chan].vol1 = 63;
-
- if(channel[chan].vol2 + amount < 63)
- channel[chan].vol2 += amount;
- else
- channel[chan].vol2 = 63;
-}
-
-void CmodPlayer::vol_down(unsigned char chan, int amount)
-{
- if(channel[chan].vol1 - amount > 0)
- channel[chan].vol1 -= amount;
- else
- channel[chan].vol1 = 0;
-
- if(channel[chan].vol2 - amount > 0)
- channel[chan].vol2 -= amount;
- else
- channel[chan].vol2 = 0;
-}
-
-void CmodPlayer::vol_up_alt(unsigned char chan, int amount)
-{
- if(channel[chan].vol1 + amount < 63)
- channel[chan].vol1 += amount;
- else
- channel[chan].vol1 = 63;
- if(inst[channel[chan].inst].data[0] & 1) {
- if(channel[chan].vol2 + amount < 63)
- channel[chan].vol2 += amount;
- else
- channel[chan].vol2 = 63;
- }
-}
-
-void CmodPlayer::vol_down_alt(unsigned char chan, int amount)
-{
- if(channel[chan].vol1 - amount > 0)
- channel[chan].vol1 -= amount;
- else
- channel[chan].vol1 = 0;
- if(inst[channel[chan].inst].data[0] & 1) {
- if(channel[chan].vol2 - amount > 0)
- channel[chan].vol2 -= amount;
- else
- channel[chan].vol2 = 0;
- }
-}
diff --git a/src/adplug/core/protrack.h b/src/adplug/core/protrack.h
deleted file mode 100644
index 7cd8c77..0000000
--- a/src/adplug/core/protrack.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * protrack.h - Generic Protracker Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_PROTRACK
-#define H_PROTRACK
-
-#include "player.h"
-
-class CmodPlayer: public CPlayer
-{
-public:
- CmodPlayer(Copl *newopl);
- virtual ~CmodPlayer();
-
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- unsigned int getpatterns()
- { return nop; }
- unsigned int getpattern()
- { return order[ord]; }
- unsigned int getorders()
- { return length; }
- unsigned int getorder()
- { return ord; }
- unsigned int getrow()
- { return rw; }
- unsigned int getspeed()
- { return speed; }
-
- protected:
- enum Flags {
- Standard = 0,
- Decimal = 1 << 0,
- Faust = 1 << 1,
- NoKeyOn = 1 << 2,
- Opl3 = 1 << 3,
- Tremolo = 1 << 4,
- Vibrato = 1 << 5,
- Percussion = 1 << 6
- };
-
- struct Instrument {
- unsigned char data[11],arpstart,arpspeed,arppos,arpspdcnt,misc;
- signed char slide;
- } *inst;
-
- struct Tracks {
- unsigned char note,command,inst,param2,param1;
- } **tracks;
-
- unsigned char *order, *arplist, *arpcmd, initspeed;
- unsigned short tempo, **trackord, bpm, nop;
- unsigned long length, restartpos, activechan;
- int flags, curchip;
-
- struct Channel {
- unsigned short freq,nextfreq;
- unsigned char oct,vol1,vol2,inst,fx,info1,info2,key,nextoct,
- note,portainfo,vibinfo1,vibinfo2,arppos,arpspdcnt;
- signed char trigger;
- } *channel;
-
- void init_trackord();
- bool init_specialarp();
- void init_notetable(const unsigned short *newnotetable);
- bool realloc_order(unsigned long len);
- bool realloc_patterns(unsigned long pats, unsigned long rows, unsigned long chans);
- bool realloc_instruments(unsigned long len);
-
- void dealloc();
-
- private:
- static const unsigned short sa2_notetable[12];
- static const unsigned char vibratotab[32];
-
- unsigned char speed, del, songend, regbd;
- unsigned short notetable[12];
- unsigned long rw, ord, nrows, npats, nchans;
-
- void setvolume(unsigned char chan);
- void setvolume_alt(unsigned char chan);
- void setfreq(unsigned char chan);
- void playnote(unsigned char chan);
- void setnote(unsigned char chan, int note);
- void slide_down(unsigned char chan, int amount);
- void slide_up(unsigned char chan, int amount);
- void tone_portamento(unsigned char chan, unsigned char info);
- void vibrato(unsigned char chan, unsigned char speed, unsigned char depth);
- void vol_up(unsigned char chan, int amount);
- void vol_down(unsigned char chan, int amount);
- void vol_up_alt(unsigned char chan, int amount);
- void vol_down_alt(unsigned char chan, int amount);
-
- void dealloc_patterns();
- bool resolve_order();
- unsigned char set_opl_chip(unsigned char chan);
-};
-
-#endif
diff --git a/src/adplug/core/psi.cc b/src/adplug/core/psi.cc
deleted file mode 100644
index 720cc8a..0000000
--- a/src/adplug/core/psi.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] PSI player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : 4BIDDEN.COM, PGRID.EXE
- type : Forbidden Dreams BBStro
- Power Grid BBStro
- tune : by Friar Tuck [Shadow Faction/ICE]
- player : by Psi [Future Crew]
- comment : seems to me what 4bidden tune & player was ripped from pgrid
-
- file(s) : MYSTRUNE.COM
- type : Mystical Runes BBStro
- tune : by ?
- player : by Psi [Future Crew]
-*/
-
-#include "psi.h"
-#include "debug.h"
-
-const unsigned char CxadpsiPlayer::psi_adlib_registers[99] =
-{
- 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0xC0,
- 0x21, 0x24, 0x41, 0x44, 0x61, 0x64, 0x81, 0x84, 0xE1, 0xE4, 0xC1,
- 0x22, 0x25, 0x42, 0x45, 0x62, 0x65, 0x82, 0x85, 0xE2, 0xE5, 0xC2,
- 0x28, 0x2B, 0x48, 0x4B, 0x68, 0x6B, 0x88, 0x8B, 0xE8, 0xEB, 0xC3,
- 0x29, 0x2C, 0x49, 0x4C, 0x69, 0x6C, 0x89, 0x8C, 0xE9, 0xEC, 0xC4,
- 0x2A, 0x2D, 0x4A, 0x4D, 0x6A, 0x6D, 0x8A, 0x8D, 0xEA, 0xED, 0xC5,
- 0x30, 0x33, 0x50, 0x53, 0x70, 0x73, 0x90, 0x93, 0xF0, 0xF3, 0xC6,
- 0x31, 0x34, 0x51, 0x54, 0x71, 0x74, 0x91, 0x94, 0xF1, 0xF4, 0xC7,
- 0x32, 0x35, 0x52, 0x55, 0x72, 0x75, 0x92, 0x95, 0xF2, 0xF5, 0xC8
-};
-
-const unsigned short CxadpsiPlayer::psi_notes[16] =
-{
- 0x216B, 0x2181, 0x2198, 0x21B0, 0x21CA, 0x21E5, 0x2202, 0x2220,
- 0x2241, 0x2263, 0x2287, 0x2364,
- 0x0000, 0x0000, 0x0000, 0x0000 // by riven
-};
-
-CPlayer *CxadpsiPlayer::factory(Copl *newopl)
-{
- return new CxadpsiPlayer(newopl);
-}
-
-void CxadpsiPlayer::xadplayer_rewind(int subsong)
-{
- opl_write(0x01, 0x20);
- opl_write(0x08, 0x00);
- opl_write(0xBD, 0x00);
-
- // get header
- header.instr_ptr = (tune[1] << 8) + tune[0];
- header.seq_ptr = (tune[3] << 8) + tune[2];
-
- // define instruments
- psi.instr_table = &tune[header.instr_ptr];
-
- for(int i=0; i<8; i++)
- {
- for(int j=0; j<11; j++) {
- unsigned short inspos = (psi.instr_table[i * 2 + 1] << 8) + psi.instr_table[i * 2];
-
- opl_write(psi_adlib_registers[i*11 + j],tune[inspos + j]);
- }
-
- opl_write(0xA0+i, 0x00);
- opl_write(0xB0+i, 0x00);
-
- psi.note_delay[i] = 1;
- psi.note_curdelay[i] = 1;
- psi.looping[i] = 0;
- }
-
- // calculate sequence pointer
- psi.seq_table = &tune[header.seq_ptr];
-}
-
-void CxadpsiPlayer::xadplayer_update()
-{
- unsigned short ptr;
-
- for(int i=0; i<8; i++)
- {
- ptr = (psi.seq_table[(i<<1) * 2 + 1] << 8) + psi.seq_table[(i<<1) * 2];
-
- psi.note_curdelay[i]--;
-
- if (!psi.note_curdelay[i])
- {
- opl_write(0xA0+i, 0x00);
- opl_write(0xB0+i, 0x00);
-
- unsigned char event = tune[ptr++];
-#ifdef DEBUG
- AdPlug_LogWrite("channel %02X, event %02X:\n",i+1,event);
-#endif
-
- // end of sequence ?
- if (!event)
- {
- ptr = (psi.seq_table[(i<<1) * 2 + 3] << 8) + psi.seq_table[(i<<1) * 2 + 2];
-
- event = tune[ptr++];
-#ifdef DEBUG
- AdPlug_LogWrite(" channel %02X, event %02X:\n",i+1,event);
-#endif
-
- // set sequence loop flag
- psi.looping[i] = 1;
-
- // module loop ?
- plr.looping = 1;
- for(int j=0; j<8; j++)
- plr.looping &= psi.looping[j];
- }
-
- // new note delay ?
- if (event & 0x80)
- {
- psi.note_delay[i] = (event & 0x7F);
-
- event = tune[ptr++];
-#ifdef DEBUG
- AdPlug_LogWrite(" channel %02X, event %02X:\n",i+1,event);
-#endif
- }
-
- psi.note_curdelay[i] = psi.note_delay[i];
-
- // play note
- unsigned short note = psi_notes[event & 0x0F];
-
- opl_write(0xA0+i, note & 0xFF);
- opl_write(0xB0+i, (note >> 8) + ((event >> 2) & 0xFC));
-
- // save position
- psi.seq_table[(i<<1) * 2] = ptr & 0xff;
- psi.seq_table[(i<<1) * 2 + 1] = ptr >> 8;
- }
- }
-}
-
-float CxadpsiPlayer::xadplayer_getrefresh()
-{
- return 70.0f;
-}
-
-std::string CxadpsiPlayer::xadplayer_gettype()
-{
- return std::string("xad: psi player");
-}
-
-unsigned int CxadpsiPlayer::xadplayer_getinstruments()
-{
- return 8;
-}
diff --git a/src/adplug/core/psi.h b/src/adplug/core/psi.h
deleted file mode 100644
index 8fbff06..0000000
--- a/src/adplug/core/psi.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] PSI player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadpsiPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadpsiPlayer(Copl *newopl): CxadPlayer(newopl)
- { }
-
-protected:
- struct psi_header
- {
- unsigned short instr_ptr;
- unsigned short seq_ptr;
- } header;
-
- struct
- {
- unsigned char *instr_table;
- unsigned char *seq_table;
- unsigned char note_delay[9];
- unsigned char note_curdelay[9];
- unsigned char looping[9];
- } psi;
- //
- bool xadplayer_load()
- {
- if(xad.fmt == PSI)
- return true;
- else
- return false;
- }
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
- unsigned int xadplayer_getinstruments();
-
-private:
- static const unsigned char psi_adlib_registers[99];
- static const unsigned short psi_notes[16];
-};
diff --git a/src/adplug/core/rad.cc b/src/adplug/core/rad.cc
deleted file mode 100644
index 49cacea..0000000
--- a/src/adplug/core/rad.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rad.cpp - RAD Loader by Simon Peter <dn.tlp@gmx.net>
- *
- * BUGS:
- * some volumes are dropped out
- */
-
-#include <cstring>
-#include "rad.h"
-
-CPlayer *CradLoader::factory(Copl *newopl)
-{
- return new CradLoader(newopl);
-}
-
-bool CradLoader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[16];
- unsigned char buf,ch,c,b,inp;
- char bufstr[2] = "\0";
- unsigned int i,j;
- unsigned short patofs[32];
- const unsigned char convfx[16] = {255,1,2,3,255,5,255,255,255,255,20,255,17,0xd,255,19};
-
- // file validation section
- f->readString(id, 16); version = f->readInt(1);
- if(strncmp(id,"RAD by REALiTY!!",16) || version != 0x10)
- { fp.close(f); return false; }
-
- // load section
- radflags = f->readInt(1);
- if(radflags & 128) { // description
- memset(desc,0,80*22);
- while((buf = f->readInt(1)))
- if(buf == 1)
- strcat(desc,"\n");
- else
- if(buf >= 2 && buf <= 0x1f)
- for(i=0;i<buf;i++)
- strcat(desc," ");
- else {
- *bufstr = buf;
- strcat(desc,bufstr);
- }
- }
- while((buf = f->readInt(1))) { // instruments
- buf--;
- inst[buf].data[2] = f->readInt(1); inst[buf].data[1] = f->readInt(1);
- inst[buf].data[10] = f->readInt(1); inst[buf].data[9] = f->readInt(1);
- inst[buf].data[4] = f->readInt(1); inst[buf].data[3] = f->readInt(1);
- inst[buf].data[6] = f->readInt(1); inst[buf].data[5] = f->readInt(1);
- inst[buf].data[0] = f->readInt(1);
- inst[buf].data[8] = f->readInt(1); inst[buf].data[7] = f->readInt(1);
- }
- length = f->readInt(1);
- for(i = 0; i < length; i++) order[i] = f->readInt(1); // orderlist
- for(i = 0; i < 32; i++) patofs[i] = f->readInt(2); // pattern offset table
- init_trackord(); // patterns
- for(i=0;i<32;i++)
- if(patofs[i]) {
- f->seek(patofs[i]);
- do {
- buf = f->readInt(1); b = buf & 127;
- do {
- ch = f->readInt(1); c = ch & 127;
- inp = f->readInt(1);
- tracks[i*9+c][b].note = inp & 127;
- tracks[i*9+c][b].inst = (inp & 128) >> 3;
- inp = f->readInt(1);
- tracks[i*9+c][b].inst += inp >> 4;
- tracks[i*9+c][b].command = inp & 15;
- if(inp & 15) {
- inp = f->readInt(1);
- tracks[i*9+c][b].param1 = inp / 10;
- tracks[i*9+c][b].param2 = inp % 10;
- }
- } while(!(ch & 128));
- } while(!(buf & 128));
- } else
- memset(trackord[i],0,9*2);
- fp.close(f);
-
- // convert replay data
- for(i=0;i<32*9;i++) // convert patterns
- for(j=0;j<64;j++) {
- if(tracks[i][j].note == 15)
- tracks[i][j].note = 127;
- if(tracks[i][j].note > 16 && tracks[i][j].note < 127)
- tracks[i][j].note -= 4 * (tracks[i][j].note >> 4);
- if(tracks[i][j].note && tracks[i][j].note < 126)
- tracks[i][j].note++;
- tracks[i][j].command = convfx[tracks[i][j].command];
- }
- restartpos = 0; initspeed = radflags & 31;
- bpm = radflags & 64 ? 0 : 50; flags = Decimal;
-
- rewind(0);
- return true;
-}
-
-float CradLoader::getrefresh()
-{
- if(tempo)
- return (float) (tempo);
- else
- return 18.2f;
-}
diff --git a/src/adplug/core/rad.h b/src/adplug/core/rad.h
deleted file mode 100644
index ac4ce73..0000000
--- a/src/adplug/core/rad.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rad.h - RAD Loader by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "protrack.h"
-
-class CradLoader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CradLoader(Copl *newopl)
- : CmodPlayer(newopl)
- { *desc = '\0'; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- float getrefresh();
-
- std::string gettype()
- { return std::string("Reality ADlib Tracker"); };
- std::string getdesc()
- { return std::string(desc); };
-
-private:
- unsigned char version,radflags;
- char desc[80*22];
-};
diff --git a/src/adplug/core/rat.cc b/src/adplug/core/rat.cc
deleted file mode 100644
index 3b3a6bf..0000000
--- a/src/adplug/core/rat.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] RAT player, by Riven the Mage <riven@ok.ru>
- */
-
-/*
- - discovery -
-
- file(s) : PINA.EXE
- type : Experimental Connection BBStro tune
- tune : by (?)Ratt/GRIF
- player : by (?)Ratt/GRIF
- comment : there are bug in original replayer's adlib_init(): wrong frequency registers.
-*/
-
-#include <cstring>
-#include "rat.h"
-#include "debug.h"
-
-const unsigned char CxadratPlayer::rat_adlib_bases[18] =
-{
- 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12,
- 0x03, 0x04, 0x05, 0x0B, 0x0C, 0x0D, 0x13, 0x14, 0x15
-};
-
-const unsigned short CxadratPlayer::rat_notes[16] =
-{
- 0x157, 0x16B, 0x181, 0x198, 0x1B0, 0x1CA, 0x1E5, 0x202, 0x220, 0x241, 0x263, 0x287,
- 0x000, 0x000, 0x000, 0x000 // by riven
-};
-
-CPlayer *CxadratPlayer::factory(Copl *newopl)
-{
- return new CxadratPlayer(newopl);
-}
-
-bool CxadratPlayer::xadplayer_load()
-{
- if(xad.fmt != RAT)
- return false;
-
- // load header
- memcpy(&rat.hdr, &tune[0], sizeof(rat_header));
-
- // is 'RAT'-signed ?
- if (strncmp(rat.hdr.id,"RAT",3))
- return false;
-
- // is version 1.0 ?
- if (rat.hdr.version != 0x10)
- return false;
-
- // load order
- rat.order = &tune[0x40];
-
- // load instruments
- rat.inst = (rat_instrument *)&tune[0x140];
-
- // load pattern data
- unsigned short patseg = (rat.hdr.patseg[1] << 8) + rat.hdr.patseg[0];
- unsigned char *event_ptr = &tune[patseg << 4];
-
- for(int i=0;i<rat.hdr.numpat;i++)
- for(int j=0;j<64;j++)
- for(int k=0;k<rat.hdr.numchan;k++)
- {
- memcpy(&rat.tracks[i][j][k], event_ptr, sizeof(rat_event));
-
- event_ptr += sizeof(rat_event);
- }
-
- return true;
-}
-
-void CxadratPlayer::xadplayer_rewind(int subsong)
-{
- int i;
-
- rat.order_pos = rat.hdr.order_start;
- rat.pattern_pos = 0;
- rat.volume = rat.hdr.volume;
-
- plr.speed = rat.hdr.speed;
-
- // clear channel data
- memset(&rat.channel, 0, sizeof(rat.channel[0])*9);
-
- // init OPL
- opl_write(0x01, 0x20);
- opl_write(0x08, 0x00);
- opl_write(0xBD, 0x00);
-
- // set default frequencies
- for(i=0;i<9;i++)
- {
- opl_write(0xA0+i, 0x00);
- opl_write(0xA3+i, 0x00);
- opl_write(0xB0+i, 0x00);
- opl_write(0xB3+i, 0x00);
- }
-
- // set default volumes
- for(i=0;i<0x1F;i++)
- opl_write(0x40+i, 0x3F);
-}
-
-void CxadratPlayer::xadplayer_update()
-{
- int i;
-
- rat_event event;
-
- // process events
- for(i=0;i<rat.hdr.numchan;i++)
- {
- memcpy(&event,&rat.tracks[rat.order[rat.order_pos]][rat.pattern_pos][i],sizeof(rat_event));
-#ifdef DEBUG
- AdPlug_LogWrite("order %02X, pattern %02X, row %02X, channel %02X, event %02X %02X %02X %02X %02X:\n",
- rat.order_pos, rat.order[rat.order_pos], rat.pattern_pos, i, event.note, event.instrument, event.volume, event.fx, event.fxp
- );
-#endif
-
- // is instrument ?
- if (event.instrument != 0xFF)
- {
- rat.channel[i].instrument = event.instrument - 1;
- rat.channel[i].volume = rat.inst[event.instrument - 1].volume;
- }
-
- // is volume ?
- if (event.volume != 0xFF)
- rat.channel[i].volume = event.volume;
-
- // is note ?
- if (event.note != 0xFF)
- {
- // mute channel
- opl_write(0xB0+i, 0x00);
- opl_write(0xA0+i, 0x00);
-
- // if note != 0xFE then play
- if (event.note != 0xFE)
- {
- unsigned char ins = rat.channel[i].instrument;
-
- // synthesis/feedback
- opl_write(0xC0+i, rat.inst[ins].connect);
-
- // controls
- opl_write(0x20+rat_adlib_bases[i], rat.inst[ins].mod_ctrl);
- opl_write(0x20+rat_adlib_bases[i+9], rat.inst[ins].car_ctrl);
-
- // volumes
- opl_write(0x40+rat_adlib_bases[i], __rat_calc_volume(rat.inst[ins].mod_volume,rat.channel[i].volume,rat.volume));
- opl_write(0x40+rat_adlib_bases[i+9], __rat_calc_volume(rat.inst[ins].car_volume,rat.channel[i].volume,rat.volume));
-
- // attack/decay
- opl_write(0x60+rat_adlib_bases[i], rat.inst[ins].mod_AD);
- opl_write(0x60+rat_adlib_bases[i+9], rat.inst[ins].car_AD);
-
- // sustain/release
- opl_write(0x80+rat_adlib_bases[i], rat.inst[ins].mod_SR);
- opl_write(0x80+rat_adlib_bases[i+9], rat.inst[ins].car_SR);
-
- // waveforms
- opl_write(0xE0+rat_adlib_bases[i], rat.inst[ins].mod_wave);
- opl_write(0xE0+rat_adlib_bases[i+9], rat.inst[ins].car_wave);
-
- // octave/frequency
- unsigned short insfreq = (rat.inst[ins].freq[1] << 8) + rat.inst[ins].freq[0];
- unsigned short freq = insfreq * rat_notes[event.note & 0x0F] / 0x20AB;
-
- opl_write(0xA0+i, freq & 0xFF);
- opl_write(0xB0+i, (freq >> 8) | ((event.note & 0xF0) >> 2) | 0x20);
- }
- }
-
- // is effect ?
- if (event.fx != 0xFF)
- {
- rat.channel[i].fx = event.fx;
- rat.channel[i].fxp = event.fxp;
- }
- }
-
- // next row
- rat.pattern_pos++;
-
- // process effects
- for(i=0;i<rat.hdr.numchan;i++)
- {
- unsigned char old_order_pos = rat.order_pos;
-
- switch (rat.channel[i].fx)
- {
- case 0x01: // 0x01: Set Speed
- plr.speed = rat.channel[i].fxp;
- break;
- case 0x02: // 0x02: Position Jump
- if (rat.channel[i].fxp < rat.hdr.order_end)
- rat.order_pos = rat.channel[i].fxp;
- else
- rat.order_pos = 0;
-
- // jumpback ?
- if (rat.order_pos <= old_order_pos)
- plr.looping = 1;
-
- rat.pattern_pos = 0;
- break;
- case 0x03: // 0x03: Pattern Break (?)
- rat.pattern_pos = 0x40;
- break;
- }
-
- rat.channel[i].fx = 0;
- }
-
- // end of pattern ?
- if (rat.pattern_pos >= 0x40)
- {
- rat.pattern_pos = 0;
-
- rat.order_pos++;
-
- // end of module ?
- if (rat.order_pos == rat.hdr.order_end)
- {
- rat.order_pos = rat.hdr.order_loop;
-
- plr.looping = 1;
- }
- }
-}
-
-float CxadratPlayer::xadplayer_getrefresh()
-{
- return 60.0f;
-}
-
-std::string CxadratPlayer::xadplayer_gettype()
-{
- return (std::string("xad: rat player"));
-}
-
-std::string CxadratPlayer::xadplayer_gettitle()
-{
- return (std::string(rat.hdr.title,32));
-}
-
-unsigned int CxadratPlayer::xadplayer_getinstruments()
-{
- return rat.hdr.numinst;
-}
-
-/* -------- Internal Functions ---------------------------- */
-
-unsigned char CxadratPlayer::__rat_calc_volume(unsigned char ivol, unsigned char cvol, unsigned char gvol)
-{
-#ifdef DEBUG
- AdPlug_LogWrite("volumes: instrument %02X, channel %02X, global %02X:\n", ivol, cvol, gvol);
-#endif
- unsigned short vol;
-
- vol = ivol;
- vol &= 0x3F;
- vol ^= 0x3F;
- vol *= cvol;
- vol >>= 6;
- vol *= gvol;
- vol >>= 6;
- vol ^= 0x3F;
-
- vol |= ivol & 0xC0;
-
- return vol;
-}
diff --git a/src/adplug/core/rat.h b/src/adplug/core/rat.h
deleted file mode 100644
index 79f4ad8..0000000
--- a/src/adplug/core/rat.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * [xad] RAT player, by Riven the Mage <riven@ok.ru>
- */
-
-#include "xad.h"
-
-class CxadratPlayer: public CxadPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadratPlayer(Copl *newopl): CxadPlayer(newopl)
- { }
-
-protected:
- struct rat_header
- {
- char id[3];
- unsigned char version;
- char title[32];
- unsigned char numchan;
- unsigned char reserved_25;
- unsigned char order_end;
- unsigned char reserved_27;
- unsigned char numinst; // ?: Number of Instruments
- unsigned char reserved_29;
- unsigned char numpat; // ?: Number of Patterns
- unsigned char reserved_2B;
- unsigned char order_start;
- unsigned char reserved_2D;
- unsigned char order_loop;
- unsigned char reserved_2F;
- unsigned char volume;
- unsigned char speed;
- unsigned char reserved_32[12];
- unsigned char patseg[2];
- };
-
- struct rat_event
- {
- unsigned char note;
- unsigned char instrument;
- unsigned char volume;
- unsigned char fx;
- unsigned char fxp;
- };
-
- struct rat_instrument
- {
- unsigned char freq[2];
- unsigned char reserved_2[2];
- unsigned char mod_ctrl;
- unsigned char car_ctrl;
- unsigned char mod_volume;
- unsigned char car_volume;
- unsigned char mod_AD;
- unsigned char car_AD;
- unsigned char mod_SR;
- unsigned char car_SR;
- unsigned char mod_wave;
- unsigned char car_wave;
- unsigned char connect;
- unsigned char reserved_F;
- unsigned char volume;
- unsigned char reserved_11[3];
- };
-
- struct
- {
- rat_header hdr;
-
- unsigned char volume;
- unsigned char order_pos;
- unsigned char pattern_pos;
-
- unsigned char *order;
-
- rat_instrument *inst;
-
- rat_event tracks[256][64][9];
-
- struct
- {
- unsigned char instrument;
- unsigned char volume;
- unsigned char fx;
- unsigned char fxp;
- } channel[9];
- } rat;
- //
- bool xadplayer_load();
- void xadplayer_rewind(int subsong);
- void xadplayer_update();
- float xadplayer_getrefresh();
- std::string xadplayer_gettype();
- std::string xadplayer_gettitle();
- unsigned int xadplayer_getinstruments();
- //
-private:
- static const unsigned char rat_adlib_bases[18];
- static const unsigned short rat_notes[16];
-
- unsigned char __rat_calc_volume(unsigned char ivol, unsigned char cvol, unsigned char gvol);
-};
diff --git a/src/adplug/core/raw.cc b/src/adplug/core/raw.cc
deleted file mode 100644
index 0100a1f..0000000
--- a/src/adplug/core/raw.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * raw.c - RAW Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <cstring>
-#include "raw.h"
-
-/*** public methods *************************************/
-
-CPlayer *CrawPlayer::factory(Copl *newopl)
-{
- return new CrawPlayer(newopl);
-}
-
-bool CrawPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[8];
- unsigned long i;
-
- // file validation section
- f->readString(id, 8);
- if(strncmp(id,"RAWADATA",8)) { fp.close (f); return false; }
-
- // load section
- clock = f->readInt(2); // clock speed
- length = (fp.filesize(f) - 10) / 2;
- data = new Tdata [length];
- for(i = 0; i < length; i++) {
- data[i].param = f->readInt(1);
- data[i].command = f->readInt(1);
- }
-
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CrawPlayer::update()
-{
- bool setspeed;
-
- if(pos >= length) return false;
-
- if(del) {
- del--;
- return !songend;
- }
-
- do {
- setspeed = false;
- switch(data[pos].command) {
- case 0: del = data[pos].param - 1; break;
- case 2:
- if(!data[pos].param) {
- pos++;
- speed = data[pos].param + (data[pos].command << 8);
- setspeed = true;
- } else
- opl->setchip(data[pos].param - 1);
- break;
- case 0xff:
- if(data[pos].param == 0xff) {
- rewind(0); // auto-rewind song
- songend = true;
- return !songend;
- }
- break;
- default:
- opl->write(data[pos].command,data[pos].param);
- break;
- }
- } while(data[pos++].command || setspeed);
-
- return !songend;
-}
-
-void CrawPlayer::rewind(int subsong)
-{
- pos = del = 0; speed = clock; songend = false;
- opl->init(); opl->write(1, 32); // go to 9 channel mode
-}
-
-float CrawPlayer::getrefresh()
-{
- return 1193180.0 / (speed ? speed : 0xffff); // timer oscillator speed / wait register = clock frequency
-}
diff --git a/src/adplug/core/raw.h b/src/adplug/core/raw.h
deleted file mode 100644
index dd935b2..0000000
--- a/src/adplug/core/raw.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * raw.h - RAW Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CrawPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CrawPlayer(Copl *newopl)
- : CPlayer(newopl), data(0)
- { };
- ~CrawPlayer()
- { if(data) delete [] data; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- { return std::string("RdosPlay RAW"); };
-
-protected:
- struct Tdata {
- unsigned char param, command;
- } *data;
-
- unsigned long pos, length;
- unsigned short clock, speed;
- unsigned char del;
- bool songend;
-};
diff --git a/src/adplug/core/rix.cc b/src/adplug/core/rix.cc
deleted file mode 100644
index f12b99f..0000000
--- a/src/adplug/core/rix.cc
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2007 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rix.cpp - Softstar RIX OPL Format Player by palxex <palxex.ys168.com>
- * BSPAL <BSPAL.ys168.com>
- */
-
-#include <cstring>
-#include "rix.h"
-#include "debug.h"
-
-const unsigned char CrixPlayer::adflag[] = {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1};
-const unsigned char CrixPlayer::reg_data[] = {0,1,2,3,4,5,8,9,10,11,12,13,16,17,18,19,20,21};
-const unsigned char CrixPlayer::ad_C0_offs[] = {0,1,2,0,1,2,3,4,5,3,4,5,6,7,8,6,7,8};
-const unsigned char CrixPlayer::modify[] = {0,3,1,4,2,5,6,9,7,10,8,11,12,15,13,16,14,17,12,\
- 15,16,0,14,0,17,0,13,0};
-const unsigned char CrixPlayer::bd_reg_data[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,
- 0x00,0x01,0x01,0x03,0x0F,0x05,0x00,0x01,0x03,0x0F,0x00,
- 0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x0F,0x07,0x00,0x02,
- 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0A,
- 0x04,0x00,0x08,0x0C,0x0B,0x00,0x00,0x00,0x01,0x00,0x00,
- 0x00,0x00,0x0D,0x04,0x00,0x06,0x0F,0x00,0x00,0x00,0x00,
- 0x01,0x00,0x00,0x0C,0x00,0x0F,0x0B,0x00,0x08,0x05,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0x0B,0x00,
- 0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
- 0x0F,0x0B,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x01,0x00,0x0F,0x0B,0x00,0x07,0x05,0x00,0x00,0x00,
- 0x00,0x00,0x00};
-unsigned char CrixPlayer::for40reg[] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
- 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F};
-unsigned short CrixPlayer::mus_time = 0x4268;
-
-/*** public methods *************************************/
-
-CPlayer *CrixPlayer::factory(Copl *newopl)
-{
- return new CrixPlayer(newopl);
-}
-
-CrixPlayer::CrixPlayer(Copl *newopl)
- : CPlayer(newopl), flag_mkf(0), file_buffer(0), buf_addr(0)
-{
-}
-
-CrixPlayer::~CrixPlayer()
-{
- if(file_buffer)
- delete [] file_buffer;
-}
-
-bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- unsigned long i=0;
-
- if(strcasecmp(filename.substr(filename.length()-4,4).c_str(),".mkf")==0)
- {
- flag_mkf=1;
- f->seek(0);
- int offset=f->readInt(4);
- f->seek(offset);
- }
- if(f->readInt(2)!=0x55aa){ fp.close(f);return false; }
- file_buffer = new unsigned char [fp.filesize(f) + 1];
- f->seek(0);
- while(!f->eof())
- file_buffer[i++]=f->readInt(1);
- length=i;
- fp.close(f);
- if(!flag_mkf)
- buf_addr=file_buffer;
- rewind(0);
- return true;
-}
-
-bool CrixPlayer::update()
-{
- int_08h_entry();
- return !play_end;
-}
-
-void CrixPlayer::rewind(int subsong)
-{
- I = 0; T = 0;
- mus_block = 0;
- ins_block = 0;
- rhythm = 0;
- music_on = 0;
- pause_flag = 0;
- band = 0;
- band_low = 0;
- e0_reg_flag = 0;
- bd_modify = 0;
- sustain = 0;
- play_end = 0;
- pos = index = 0;
-
- memset(f_buffer, 0, sizeof(unsigned short) * 300);
- memset(a0b0_data2, 0, sizeof(unsigned short) * 11);
- memset(a0b0_data3, 0, 18);
- memset(a0b0_data4, 0, 18);
- memset(a0b0_data5, 0, 96);
- memset(addrs_head, 0, 96);
- memset(insbuf, 0, 28 * sizeof(unsigned short));
- memset(displace, 0, 11 * sizeof(unsigned short));
- memset(reg_bufs, 0, 18 * sizeof(ADDT));
-
- if(flag_mkf)
- {
- unsigned int *buf_index=(unsigned int *)file_buffer;
- int offset1=buf_index[subsong],offset2;
- while((offset2=buf_index[++subsong])==offset1);
- length=offset2-offset1+1;
- buf_addr=file_buffer+offset1;
- }
- opl->init();
- opl->write(1,32); // go to OPL2 mode
- set_new_int();
- data_initial();
-}
-
-unsigned int CrixPlayer::getsubsongs()
-{
- if(flag_mkf)
- {
- unsigned int *buf_index=(unsigned int *)file_buffer;
- int songs=buf_index[0]/4,i=0;
- for(i=0;i<songs;i++)
- if(buf_index[i+1]==buf_index[i])
- songs--;
- return songs;
- }
- else
- return 1;
-}
-
-float CrixPlayer::getrefresh()
-{
- return 70.0f;
-}
-
-/*------------------Implemention----------------------------*/
-inline void CrixPlayer::set_new_int()
-{
-// if(!ad_initial()) exit(1);
- ad_initial();
-}
-/*----------------------------------------------------------*/
-inline void CrixPlayer::Pause()
-{
- unsigned short i;
- pause_flag = 1;
- for(i=0;i<11;i++)
- switch_ad_bd(i);
-}
-/*----------------------------------------------------------*/
-inline void CrixPlayer::ad_a0b0l_reg_(unsigned short index,unsigned short p2,unsigned short p3)
-{
-// unsigned short i = p2+a0b0_data2[index];
- a0b0_data4[index] = p3;
- a0b0_data3[index] = p2;
-}
-inline void CrixPlayer::data_initial()
-{
- rhythm = buf_addr[2];
- mus_block = (buf_addr[0x0D]<<8)+buf_addr[0x0C];
- ins_block = (buf_addr[0x09]<<8)+buf_addr[0x08];
- I = mus_block+1;
- if(rhythm != 0)
- {
- // ad_a0b0_reg(6);
- // ad_a0b0_reg(7);
- // ad_a0b0_reg(8);
- ad_a0b0l_reg_(8,0x18,0);
- ad_a0b0l_reg_(7,0x1F,0);
- }
- bd_modify = 0;
- // ad_bd_reg();
- band = 0; music_on = 1;
-}
-/*----------------------------------------------------------*/
-inline unsigned short CrixPlayer::ad_initial()
-{
- unsigned short i,j,k = 0;
- for(i=0;i<25;i++)
- {
- f_buffer[i*12]=(unsigned int)((i*24+10000)*0.27461678223+4)>>3;
- for(int t=1;t<12;t++)
- f_buffer[i*12+t]=f_buffer[i*12+t-1]*1.06;
- }
- for(i=0;i<8;i++)
- for(j=0;j<12;j++)
- {
- a0b0_data5[k] = i;
- addrs_head[k] = j;
- k++;
- }
- //ad_bd_reg();
- //ad_08_reg();
- //for(i=0;i<9;i++) ad_a0b0_reg(i);
- e0_reg_flag = 0x20;
- //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0);
- //ad_bop(1,e0_reg_flag);
- return 1;//ad_test();
-}
-/*----------------------------------------------------------*/
-inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value)
-{
- if(reg == 2 || reg == 3)
- AdPlug_LogWrite("switch OPL2/3 mode!\n");
- opl->write(reg & 0xff, value & 0xff);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::int_08h_entry()
- {
- unsigned short band_sus = 1;
- while(band_sus)
- {
- if(sustain <= 0)
- {
- band_sus = rix_proc();
- if(band_sus) sustain += band_sus;
- else
- {
- play_end=1;
- break;
- }
- }
- else
- {
- if(band_sus) sustain -= 14; /* aging */
- break;
- }
- }
- }
-/*--------------------------------------------------------------*/
-inline unsigned short CrixPlayer::rix_proc()
-{
- unsigned char ctrl = 0;
- if(music_on == 0||pause_flag == 1) return 0;
- band = 0;
- while(buf_addr[I] != 0x80 && I<length-1)
- {
- band_low = buf_addr[I-1];
- ctrl = buf_addr[I]; I+=2;
- switch(ctrl&0xF0)
- {
- case 0x90: rix_get_ins(); rix_90_pro(ctrl&0x0F); break;
- case 0xA0: rix_A0_pro(ctrl&0x0F,((unsigned short)band_low)<<6); break;
- case 0xB0: rix_B0_pro(ctrl&0x0F,band_low); break;
- case 0xC0: switch_ad_bd(ctrl&0x0F);
- if(band_low != 0) rix_C0_pro(ctrl&0x0F,band_low);
- break;
- default: band = (ctrl<<8)+band_low; break;
- }
- if(band != 0) return band;
- }
- music_ctrl();
- I = mus_block+1;
- band = 0; music_on = 1;
- return 0;
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::rix_get_ins()
-{
- int i;
- unsigned char *baddr = (&buf_addr[ins_block])+(band_low<<6);
-
- for(i = 0; i < 28; i++)
- insbuf[i] = (baddr[i * 2 + 1] << 8) + baddr[i * 2];
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l)
-{
- if(rhythm == 0 || ctrl_l < 6)
- {
- ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]);
- ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]);
- return;
- }
- else if(ctrl_l > 6)
- {
- ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]);
- return;
- }
- else
- {
- ins_to_reg(12,insbuf,insbuf[26]);
- ins_to_reg(15,insbuf+13,insbuf[27]);
- return;
- }
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index)
-{
- if(rhythm == 0 || ctrl_l <= 6)
- {
- prepare_a0b0(ctrl_l,index>0x3FFF?0x3FFF:index);
- ad_a0b0l_reg(ctrl_l,a0b0_data3[ctrl_l],a0b0_data4[ctrl_l]);
- }
- else return;
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/
-{
- short high = 0,low = 0; unsigned int res;
- int res1 = (v-0x2000)*0x19;
- if(res1 == (int)0xff) return;
- low = res1/0x2000;
- if(low < 0)
- {
- low = 0x18-low; high = (signed short)low<0?0xFFFF:0;
- res = high; res<<=16; res+=low;
- low = ((signed short)res)/(signed short)0xFFE7;
- a0b0_data2[index] = low;
- low = res;
- res = low - 0x18;
- high = (signed short)res%0x19;
- low = (signed short)res/0x19;
- if(high != 0) {low = 0x19; low = low-high;}
- }
- else
- {
- res = high = low;
- low = (signed short)res/(signed short)0x19;
- a0b0_data2[index] = low;
- res = high;
- low = (signed short)res%(signed short)0x19;
- }
- low = (signed short)low*(signed short)0x18;
- displace[index] = low;
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_a0b0l_reg(unsigned short index,unsigned short p2,unsigned short p3)
-{
- unsigned short data; unsigned short i = p2+a0b0_data2[index];
- a0b0_data4[index] = p3;
- a0b0_data3[index] = p2;
- i = ((signed short)i<=0x5F?i:0x5F);
- i = ((signed short)i>=0?i:0);
- data = f_buffer[addrs_head[i]+displace[index]/2];
- ad_bop(0xA0+index,data);
- data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3);
- ad_bop(0xB0+index,data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::rix_B0_pro(unsigned short ctrl_l,unsigned short index)
-{
- int temp = 0;
- if(rhythm == 0 || ctrl_l < 6) temp = modify[ctrl_l*2+1];
- else
- {
- temp = ctrl_l > 6?ctrl_l*2:ctrl_l*2+1;
- temp = modify[temp+6];
- }
- for40reg[temp] = index>0x7F?0x7F:index;
- ad_40_reg(temp);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::rix_C0_pro(unsigned short ctrl_l,unsigned short index)
-{
- unsigned short i = index>=12?index-12:0;
- if(ctrl_l < 6 || rhythm == 0)
- {
- ad_a0b0l_reg(ctrl_l,i,1);
- return;
- }
- else
- {
- if(ctrl_l != 6)
- {
- if(ctrl_l == 8)
- {
- ad_a0b0l_reg(ctrl_l,i,0);
- ad_a0b0l_reg(7,i+7,0);
- }
- }
- else ad_a0b0l_reg(ctrl_l,i,0);
- bd_modify |= bd_reg_data[ctrl_l];
- ad_bd_reg();
- return;
- }
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::switch_ad_bd(unsigned short index)
-{
-
- if(rhythm == 0 || index < 6) ad_a0b0l_reg(index,a0b0_data3[index],0);
- else
- {
- bd_modify &= (~bd_reg_data[index]),
- ad_bd_reg();
- }
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ins_to_reg(unsigned short index,unsigned short* insb,unsigned short value)
-{
- unsigned short i;
- for(i=0;i<13;i++) reg_bufs[index].v[i] = insb[i];
- reg_bufs[index].v[13] = value&3;
- ad_bd_reg(),ad_08_reg(),
- ad_40_reg(index),ad_C0_reg(index),ad_60_reg(index),
- ad_80_reg(index),ad_20_reg(index),ad_E0_reg(index);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_E0_reg(unsigned short index)
-{
- unsigned short data = e0_reg_flag == 0?0:(reg_bufs[index].v[13]&3);
- ad_bop(0xE0+reg_data[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_20_reg(unsigned short index)
-{
- unsigned short data = (reg_bufs[index].v[9] < 1?0:0x80);
- data += (reg_bufs[index].v[10] < 1?0:0x40);
- data += (reg_bufs[index].v[5] < 1?0:0x20);
- data += (reg_bufs[index].v[11] < 1?0:0x10);
- data += (reg_bufs[index].v[1]&0x0F);
- ad_bop(0x20+reg_data[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_80_reg(unsigned short index)
-{
- unsigned short data = (reg_bufs[index].v[7]&0x0F),temp = reg_bufs[index].v[4];
- data |= (temp << 4);
- ad_bop(0x80+reg_data[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_60_reg(unsigned short index)
-{
- unsigned short data = reg_bufs[index].v[6]&0x0F,temp = reg_bufs[index].v[3];
- data |= (temp << 4);
- ad_bop(0x60+reg_data[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_C0_reg(unsigned short index)
-{
- unsigned short data = reg_bufs[index].v[2];
- if(adflag[index] == 1) return;
- data *= 2,
- data |= (reg_bufs[index].v[12] < 1?1:0);
- ad_bop(0xC0+ad_C0_offs[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_40_reg(unsigned short index)
-{
- unsigned int res = 0;
- unsigned short data = 0,temp = reg_bufs[index].v[0];
- data = 0x3F - (0x3F & reg_bufs[index].v[8]),
- data *= for40reg[index],
- data *= 2,
- data += 0x7F,
- res = data;
- data = res/0xFE,
- data -= 0x3F,
- data = -data,
- data |= temp<<6;
- ad_bop(0x40+reg_data[index],data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_bd_reg()
-{
- unsigned short data = rhythm < 1? 0:0x20;
- data |= bd_modify;
- ad_bop(0xBD,data);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::ad_a0b0_reg(unsigned short index)
-{
- ad_bop(0xA0+index,0);
- ad_bop(0xB0+index,0);
-}
-/*--------------------------------------------------------------*/
-inline void CrixPlayer::music_ctrl()
-{
- int i;
- for(i=0;i<11;i++)
- switch_ad_bd(i);
-}
diff --git a/src/adplug/core/rix.h b/src/adplug/core/rix.h
deleted file mode 100644
index d3abe23..0000000
--- a/src/adplug/core/rix.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rix.h - Softstar RIX OPL Format Player by palxex <palxex.ys168.com>
- * BSPAL <BSPAL.ys168.com>
- */
-
-#include "player.h"
-
-class CrixPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- CrixPlayer(Copl *newopl);
- ~CrixPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
- unsigned int getsubsongs();
-
- std::string gettype()
- { return std::string("Softstar RIX OPL Music Format"); };
-
- protected:
- typedef struct {
- unsigned char v[14];
- } ADDT;
-
- int flag_mkf;
- unsigned char *file_buffer;
- unsigned char *buf_addr; /* rix files' f_buffer */
- unsigned short f_buffer[300];//9C0h-C18h
- unsigned short a0b0_data2[11];
- unsigned char a0b0_data3[18];
- unsigned char a0b0_data4[18];
- unsigned char a0b0_data5[96];
- unsigned char addrs_head[96];
- unsigned short insbuf[28];
- unsigned short displace[11];
- ADDT reg_bufs[18];
- unsigned long pos,length;
- unsigned char index;
-
- static const unsigned char adflag[18];
- static const unsigned char reg_data[18];
- static const unsigned char ad_C0_offs[18];
- static const unsigned char modify[28];
- static const unsigned char bd_reg_data[124];
- static unsigned char for40reg[18];
- static unsigned short mus_time;
- unsigned int I,T;
- unsigned short mus_block;
- unsigned short ins_block;
- unsigned char rhythm;
- unsigned char music_on;
- unsigned char pause_flag;
- unsigned short band;
- unsigned char band_low;
- unsigned short e0_reg_flag;
- unsigned char bd_modify;
- int sustain;
- int play_end;
-
-#define ad_08_reg() ad_bop(8,0) /**/
- inline void ad_20_reg(unsigned short); /**/
- inline void ad_40_reg(unsigned short); /**/
- inline void ad_60_reg(unsigned short); /**/
- inline void ad_80_reg(unsigned short); /**/
- inline void ad_a0b0_reg(unsigned short); /**/
- inline void ad_a0b0l_reg(unsigned short,unsigned short,unsigned short); /**/
- inline void ad_a0b0l_reg_(unsigned short,unsigned short,unsigned short); /**/
- inline void ad_bd_reg(); /**/
- inline void ad_bop(unsigned short,unsigned short); /**/
- inline void ad_C0_reg(unsigned short); /**/
- inline void ad_E0_reg(unsigned short); /**/
- inline unsigned short ad_initial(); /**/
- inline unsigned short ad_test(); /**/
- inline void crc_trans(unsigned short,unsigned short); /**/
- inline void data_initial(); /* done */
- inline void init(); /**/
- inline void ins_to_reg(unsigned short,unsigned short*,unsigned short); /**/
- inline void int_08h_entry(); /**/
- inline void music_ctrl(); /**/
- inline void Pause(); /**/
- inline void prepare_a0b0(unsigned short,unsigned short); /**/
- inline void rix_90_pro(unsigned short); /**/
- inline void rix_A0_pro(unsigned short,unsigned short); /**/
- inline void rix_B0_pro(unsigned short,unsigned short); /**/
- inline void rix_C0_pro(unsigned short,unsigned short); /**/
- inline void rix_get_ins(); /**/
- inline unsigned short rix_proc(); /**/
- inline void set_new_int();
- inline void switch_ad_bd(unsigned short); /**/
-};
diff --git a/src/adplug/core/rol.cc b/src/adplug/core/rol.cc
deleted file mode 100644
index fc7e1e0..0000000
--- a/src/adplug/core/rol.cc
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rol.h - ROL Player by OPLx <oplx@yahoo.com>
- *
- * Visit: http://tenacity.hispeed.com/aomit/oplx/
- */
-#include <cstring>
-#include <algorithm>
-
-#include "rol.h"
-#include "debug.h"
-
-int const CrolPlayer::kSizeofDataRecord = 30;
-int const CrolPlayer::kMaxTickBeat = 60;
-int const CrolPlayer::kSilenceNote = -12;
-int const CrolPlayer::kNumMelodicVoices = 9;
-int const CrolPlayer::kNumPercussiveVoices = 11;
-int const CrolPlayer::kBassDrumChannel = 6;
-int const CrolPlayer::kSnareDrumChannel = 7;
-int const CrolPlayer::kTomtomChannel = 8;
-int const CrolPlayer::kTomtomFreq = 2;//4;
-int const CrolPlayer::kSnareDrumFreq = 2;//kTomtomFreq + 7;
-float const CrolPlayer::kDefaultUpdateTme = 18.2f;
-float const CrolPlayer::kPitchFactor = 400.0f;
-
-static const unsigned char drum_table[4] = {0x14, 0x12, 0x15, 0x11};
-
-CrolPlayer::uint16 const CrolPlayer::kNoteTable[12] =
-{
- 340, // C
- 363, // C#
- 385, // D
- 408, // D#
- 432, // E
- 458, // F
- 485, // F#
- 514, // G
- 544, // G#
- 577, // A
- 611, // A#
- 647 // B
-};
-
-/*** public methods **************************************/
-
-CPlayer *CrolPlayer::factory(Copl *newopl)
-{
- return new CrolPlayer(newopl);
-}
-//---------------------------------------------------------
-CrolPlayer::CrolPlayer(Copl *newopl)
-: CPlayer ( newopl )
- ,rol_header ( NULL )
- ,mNextTempoEvent ( 0 )
- ,mCurrTick ( 0 )
- ,mTimeOfLastNote ( 0 )
- ,mRefresh ( kDefaultUpdateTme )
- ,bdRegister ( 0 )
-{
- int n;
-
- memset(bxRegister, 0, sizeof(bxRegister) );
- memset(volumeCache, 0, sizeof(volumeCache) );
- memset(freqCache, 0, sizeof(freqCache) );
-
- for(n=0; n<11; n++)
- pitchCache[n]=1.0f;
-}
-//---------------------------------------------------------
-CrolPlayer::~CrolPlayer()
-{
- if( rol_header != NULL )
- {
- delete rol_header;
- rol_header=NULL;
- }
-}
-//---------------------------------------------------------
-bool CrolPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
-
- char *fn = new char[filename.length()+13];
- int i;
- std::string bnk_filename;
-
- AdPlug_LogWrite("*** CrolPlayer::load(f, \"%s\") ***\n", filename.c_str());
- strcpy(fn,filename.data());
- for (i=strlen(fn)-1; i>=0; i--)
- if (fn[i] == '/' || fn[i] == '\\')
- break;
- strcpy(fn+i+1,"standard.bnk");
- bnk_filename = fn;
- delete [] fn;
- AdPlug_LogWrite("bnk_filename = \"%s\"\n",bnk_filename.c_str());
-
- rol_header = new SRolHeader;
- memset( rol_header, 0, sizeof(SRolHeader) );
-
- rol_header->version_major = f->readInt( 2 );
- rol_header->version_minor = f->readInt( 2 );
-
- // Version check
- if(rol_header->version_major != 0 || rol_header->version_minor != 4) {
- AdPlug_LogWrite("Unsupported file version %d.%d or not a ROL file!\n",
- rol_header->version_major, rol_header->version_minor);
- AdPlug_LogWrite("--- CrolPlayer::load ---\n");
- fp.close(f);
- return false;
- }
-
- f->seek( 40, binio::Add );
-
- rol_header->ticks_per_beat = f->readInt( 2 );
- rol_header->beats_per_measure = f->readInt( 2 );
- rol_header->edit_scale_y = f->readInt( 2 );
- rol_header->edit_scale_x = f->readInt( 2 );
-
- f->seek( 1, binio::Add );
-
- rol_header->mode = f->readInt(1);
-
- f->seek( 90+38+15, binio::Add );
-
- rol_header->basic_tempo = f->readFloat( binio::Single );
-
- load_tempo_events( f );
-
- mTimeOfLastNote = 0;
-
- if( load_voice_data( f, bnk_filename, fp ) != true )
- {
- AdPlug_LogWrite("CrolPlayer::load_voice_data(f) failed!\n");
- AdPlug_LogWrite("--- CrolPlayer::load ---\n");
-
- fp.close( f );
- return false;
- }
-
- fp.close( f );
-
- rewind( 0 );
- AdPlug_LogWrite("--- CrolPlayer::load ---\n");
- return true;
-}
-//---------------------------------------------------------
-bool CrolPlayer::update()
-{
- if( mNextTempoEvent < mTempoEvents.size() &&
- mTempoEvents[mNextTempoEvent].time == mCurrTick )
- {
- SetRefresh( mTempoEvents[mNextTempoEvent].multiplier );
- ++mNextTempoEvent;
- }
-
- TVoiceData::iterator curr = voice_data.begin();
- TVoiceData::iterator end = voice_data.end();
- int voice = 0;
-
- while( curr != end )
- {
- UpdateVoice( voice, *curr );
- ++curr;
- ++voice;
- }
-
- ++mCurrTick;
-
- if( mCurrTick > mTimeOfLastNote )
- {
- return false;
- }
-
- return true;
- //return ( mCurrTick > mTimeOfLastNote ) ? false : true;
-}
-//---------------------------------------------------------
-void CrolPlayer::rewind( int subsong )
-{
- TVoiceData::iterator curr = voice_data.begin();
- TVoiceData::iterator end = voice_data.end();
-
- while( curr != end )
- {
- CVoiceData &voice = *curr;
-
- voice.Reset();
- ++curr;
- }
-
- memset(bxRegister, 0, sizeof(bxRegister) );
- memset(volumeCache, 0, sizeof(volumeCache) );
-
- bdRegister = 0;
-
- opl->init(); // initialize to melodic by default
- opl->write(1,0x20); // Enable waveform select (bit 5)
-
- if( rol_header->mode == 0 )
- {
- opl->write( 0xbd, 0x20 ); // select rhythm mode (bit 5)
- bdRegister = 0x20;
-
- SetFreq( kTomtomChannel, 24 );
- SetFreq( kSnareDrumChannel, 31 );
- }
-
- mNextTempoEvent = 0;
- mCurrTick = 0;
-
- SetRefresh(1.0f);
-}
-//---------------------------------------------------------
-inline float fmin( int const a, int const b )
-{
- return static_cast<float>( a < b ? a : b );
-}
-//---------------------------------------------------------
-void CrolPlayer::SetRefresh( float const multiplier )
-{
- float const tickBeat = fmin(kMaxTickBeat, rol_header->ticks_per_beat);
-
- mRefresh = (tickBeat*rol_header->basic_tempo*multiplier) / 60.0f;
-}
-//---------------------------------------------------------
-float CrolPlayer::getrefresh()
-{
- return mRefresh;
-}
-//---------------------------------------------------------
-void CrolPlayer::UpdateVoice( int const voice, CVoiceData &voiceData )
-{
- TNoteEvents const &nEvents = voiceData.note_events;
-
- if( nEvents.empty() || voiceData.mEventStatus & CVoiceData::kES_NoteEnd )
- {
- return; // no note data to process, don't bother doing anything.
- }
-
- TInstrumentEvents &iEvents = voiceData.instrument_events;
- TVolumeEvents &vEvents = voiceData.volume_events;
- TPitchEvents &pEvents = voiceData.pitch_events;
-
- if( !(voiceData.mEventStatus & CVoiceData::kES_InstrEnd ) &&
- iEvents[voiceData.next_instrument_event].time == mCurrTick )
- {
- if( voiceData.next_instrument_event < iEvents.size() )
- {
- send_ins_data_to_chip( voice, iEvents[voiceData.next_instrument_event].ins_index );
- ++voiceData.next_instrument_event;
- }
- else
- {
- voiceData.mEventStatus |= CVoiceData::kES_InstrEnd;
- }
- }
-
- if( !(voiceData.mEventStatus & CVoiceData::kES_VolumeEnd ) &&
- vEvents[voiceData.next_volume_event].time == mCurrTick )
- {
- SVolumeEvent const &volumeEvent = vEvents[voiceData.next_volume_event];
-
- if( voiceData.next_volume_event < vEvents.size() )
- {
- int const volume = (int)(63.0f*(1.0f - volumeEvent.multiplier));
-
- SetVolume( voice, volume );
-
- ++voiceData.next_volume_event; // move to next volume event
- }
- else
- {
- voiceData.mEventStatus |= CVoiceData::kES_VolumeEnd;
- }
- }
-
- if( voiceData.mForceNote || voiceData.current_note_duration > voiceData.mNoteDuration-1 )
- {
- if( mCurrTick != 0 )
- {
- ++voiceData.current_note;
- }
-
- if( voiceData.current_note < nEvents.size() )
- {
- SNoteEvent const &noteEvent = nEvents[voiceData.current_note];
-
- SetNote( voice, noteEvent.number );
- voiceData.current_note_duration = 0;
- voiceData.mNoteDuration = noteEvent.duration;
- voiceData.mForceNote = false;
- }
- else
- {
- SetNote( voice, kSilenceNote );
- voiceData.mEventStatus |= CVoiceData::kES_NoteEnd;
- return;
- }
- }
-
- if( !(voiceData.mEventStatus & CVoiceData::kES_PitchEnd ) &&
- pEvents[voiceData.next_pitch_event].time == mCurrTick )
- {
- if( voiceData.next_pitch_event < pEvents.size() )
- {
- SetPitch(voice,pEvents[voiceData.next_pitch_event].variation);
- ++voiceData.next_pitch_event;
- }
- else
- {
- voiceData.mEventStatus |= CVoiceData::kES_PitchEnd;
- }
- }
-
- ++voiceData.current_note_duration;
-}
-//---------------------------------------------------------
-void CrolPlayer::SetNote( int const voice, int const note )
-{
- if( voice < kBassDrumChannel || rol_header->mode )
- {
- SetNoteMelodic( voice, note );
- }
- else
- {
- SetNotePercussive( voice, note );
- }
-}
-//---------------------------------------------------------
-void CrolPlayer::SetNotePercussive( int const voice, int const note )
-{
- int const bit_pos = 4-voice+kBassDrumChannel;
-
- bdRegister &= ~( 1<<bit_pos );
- opl->write( 0xbd, bdRegister );
-
- if( note != kSilenceNote )
- {
- switch( voice )
- {
- case kTomtomChannel:
- SetFreq( kSnareDrumChannel, note+7 );
- case kBassDrumChannel:
- SetFreq( voice, note );
- break;
- }
-
- bdRegister |= 1<<bit_pos;
- opl->write( 0xbd, bdRegister );
- }
-}
-//---------------------------------------------------------
-void CrolPlayer::SetNoteMelodic( int const voice, int const note )
-{
- opl->write( 0xb0+voice, bxRegister[voice] & ~0x20 );
-
- if( note != kSilenceNote )
- {
- SetFreq( voice, note, true );
- }
-}
-//---------------------------------------------------------
-void CrolPlayer::SetPitch(int const voice, real32 const variation)
-{
- pitchCache[voice] = variation;
- freqCache[voice] += (uint16)((((float)freqCache[voice])*(variation-1.0f)) / kPitchFactor);
-
- opl->write(0xa0+voice,freqCache[voice] & 0xff);
-}
-//---------------------------------------------------------
-void CrolPlayer::SetFreq( int const voice, int const note, bool const keyOn )
-{
- uint16 freq = kNoteTable[note%12] + ((note/12) << 10);
- freq += (uint16)((((float)freq)*(pitchCache[voice]-1.0f))/kPitchFactor);
-
- freqCache[voice] = freq;
- bxRegister[voice] = ((freq >> 8) & 0x1f);
-
- opl->write( 0xa0+voice, freq & 0xff );
- opl->write( 0xb0+voice, bxRegister[voice] | (keyOn ? 0x20 : 0x0) );
-}
-//---------------------------------------------------------
-void CrolPlayer::SetVolume( int const voice, int const volume )
-{
- volumeCache[voice] = (volumeCache[voice] &0xc0) | volume;
-
- int const op_offset = ( voice < kSnareDrumChannel || rol_header->mode ) ?
- op_table[voice]+3 : drum_table[voice-kSnareDrumChannel];
-
- opl->write( 0x40+op_offset, volumeCache[voice] );
-}
-//---------------------------------------------------------
-void CrolPlayer::send_ins_data_to_chip( int const voice, int const ins_index )
-{
- SRolInstrument &instrument = ins_list[ins_index].instrument;
-
- send_operator( voice, instrument.modulator, instrument.carrier );
-}
-//---------------------------------------------------------
-void CrolPlayer::send_operator( int const voice, SOPL2Op const &modulator, SOPL2Op const &carrier )
-{
- if( voice < kSnareDrumChannel || rol_header->mode )
- {
- int const op_offset = op_table[voice];
-
- opl->write( 0x20+op_offset, modulator.ammulti );
- opl->write( 0x40+op_offset, modulator.ksltl );
- opl->write( 0x60+op_offset, modulator.ardr );
- opl->write( 0x80+op_offset, modulator.slrr );
- opl->write( 0xc0+voice , modulator.fbc );
- opl->write( 0xe0+op_offset, modulator.waveform );
-
- volumeCache[voice] = (carrier.ksltl & 0xc0) | (volumeCache[voice] & 0x3f);
-
- opl->write( 0x23+op_offset, carrier.ammulti );
- opl->write( 0x43+op_offset, volumeCache[voice] );
- opl->write( 0x63+op_offset, carrier.ardr );
- opl->write( 0x83+op_offset, carrier.slrr );
-// opl->write( 0xc3+voice , carrier.fbc ); <- don't bother writing this.
- opl->write( 0xe3+op_offset, carrier.waveform );
- }
- else
- {
- int const op_offset = drum_table[voice-kSnareDrumChannel];
-
- volumeCache[voice] = (modulator.ksltl & 0xc0) | (volumeCache[voice] & 0x3f);
-
- opl->write( 0x20+op_offset, modulator.ammulti );
- opl->write( 0x40+op_offset, volumeCache[voice] );
- opl->write( 0x60+op_offset, modulator.ardr );
- opl->write( 0x80+op_offset, modulator.slrr );
- opl->write( 0xc0+voice , modulator.fbc );
- opl->write( 0xe0+op_offset, modulator.waveform );
- }
-}
-//---------------------------------------------------------
-void CrolPlayer::load_tempo_events( binistream *f )
-{
- int16 const num_tempo_events = f->readInt( 2 );
-
- mTempoEvents.reserve( num_tempo_events );
-
- for(int i=0; i<num_tempo_events; ++i)
- {
- STempoEvent event;
-
- event.time = f->readInt( 2 );
- event.multiplier = f->readFloat( binio::Single );
- mTempoEvents.push_back( event );
- }
-}
-//---------------------------------------------------------
-bool CrolPlayer::load_voice_data( binistream *f, std::string const &bnk_filename, const CFileProvider &fp )
-{
- SBnkHeader bnk_header;
- binistream *bnk_file = fp.open( bnk_filename.c_str() );
-
- if( bnk_file )
- {
- load_bnk_info( bnk_file, bnk_header );
-
- int const numVoices = rol_header->mode ? kNumMelodicVoices : kNumPercussiveVoices;
-
- voice_data.reserve( numVoices );
- for(int i=0; i<numVoices; ++i)
- {
- CVoiceData voice;
-
- load_note_events( f, voice );
- load_instrument_events( f, voice, bnk_file, bnk_header );
- load_volume_events( f, voice );
- load_pitch_events( f, voice );
-
- voice_data.push_back( voice );
- }
-
- fp.close(bnk_file);
-
- return true;
- }
-
- return false;
-}
-//---------------------------------------------------------
-void CrolPlayer::load_note_events( binistream *f, CVoiceData &voice )
-{
- f->seek( 15, binio::Add );
-
- int16 const time_of_last_note = f->readInt( 2 );
-
- if( time_of_last_note != 0 )
- {
- TNoteEvents &note_events = voice.note_events;
- int16 total_duration = 0;
-
- do
- {
- SNoteEvent event;
-
- event.number = f->readInt( 2 );
- event.duration = f->readInt( 2 );
-
- event.number += kSilenceNote; // adding -12
-
- note_events.push_back( event );
-
- total_duration += event.duration;
- } while( total_duration < time_of_last_note );
-
- if( time_of_last_note > mTimeOfLastNote )
- {
- mTimeOfLastNote = time_of_last_note;
- }
- }
-
- f->seek( 15, binio::Add );
-}
-//---------------------------------------------------------
-void CrolPlayer::load_instrument_events( binistream *f, CVoiceData &voice,
- binistream *bnk_file, SBnkHeader const &bnk_header )
-{
- int16 const number_of_instrument_events = f->readInt( 2 );
-
- TInstrumentEvents &instrument_events = voice.instrument_events;
-
- instrument_events.reserve( number_of_instrument_events );
-
- for(int i=0; i<number_of_instrument_events; ++i)
- {
- SInstrumentEvent event;
- event.time = f->readInt( 2 );
- f->readString( event.name, 9 );
-
- std::string event_name = event.name;
- event.ins_index = load_rol_instrument( bnk_file, bnk_header, event_name );
-
- instrument_events.push_back( event );
-
- f->seek( 1+2, binio::Add );
- }
-
- f->seek( 15, binio::Add );
-}
-//---------------------------------------------------------
-void CrolPlayer::load_volume_events( binistream *f, CVoiceData &voice )
-{
- int16 const number_of_volume_events = f->readInt( 2 );
-
- TVolumeEvents &volume_events = voice.volume_events;
-
- volume_events.reserve( number_of_volume_events );
-
- for(int i=0; i<number_of_volume_events; ++i)
- {
- SVolumeEvent event;
- event.time = f->readInt( 2 );
- event.multiplier = f->readFloat( binio::Single );
-
- volume_events.push_back( event );
- }
-
- f->seek( 15, binio::Add );
-}
-//---------------------------------------------------------
-void CrolPlayer::load_pitch_events( binistream *f, CVoiceData &voice )
-{
- int16 const number_of_pitch_events = f->readInt( 2 );
-
- TPitchEvents &pitch_events = voice.pitch_events;
-
- pitch_events.reserve( number_of_pitch_events );
-
- for(int i=0; i<number_of_pitch_events; ++i)
- {
- SPitchEvent event;
- event.time = f->readInt( 2 );
- event.variation = f->readFloat( binio::Single );
-
- pitch_events.push_back( event );
- }
-}
-//---------------------------------------------------------
-bool CrolPlayer::load_bnk_info( binistream *f, SBnkHeader &header )
-{
- header.version_major = f->readInt(1);
- header.version_minor = f->readInt(1);
- f->readString( header.signature, 6 );
-
- header.number_of_list_entries_used = f->readInt( 2 );
- header.total_number_of_list_entries = f->readInt( 2 );
-
- header.abs_offset_of_name_list = f->readInt( 4 );
- header.abs_offset_of_data = f->readInt( 4 );
-
- f->seek( header.abs_offset_of_name_list, binio::Set );
-
- TInstrumentNames &ins_name_list = header.ins_name_list;
- ins_name_list.reserve( header.number_of_list_entries_used );
-
- for(int i=0; i<header.number_of_list_entries_used; ++i)
- {
- SInstrumentName instrument;
-
- instrument.index = f->readInt( 2 );
- instrument.record_used = f->readInt(1);
- f->readString( instrument.name, 9 );
-
- // printf("%s = #%d\n", instrument.name, i );
-
- ins_name_list.push_back( instrument );
- }
-
- //std::sort( ins_name_list.begin(), ins_name_list.end(), StringCompare() );
-
- return true;
-}
-//---------------------------------------------------------
-int CrolPlayer::load_rol_instrument( binistream *f, SBnkHeader const &header, std::string &name )
-{
- TInstrumentNames const &ins_name_list = header.ins_name_list;
-
- int const ins_index = get_ins_index( name );
-
- if( ins_index != -1 )
- {
- return ins_index;
- }
-
- typedef TInstrumentNames::const_iterator TInsIter;
- typedef std::pair<TInsIter, TInsIter> TInsIterPair;
-
- TInsIterPair range = std::equal_range( ins_name_list.begin(),
- ins_name_list.end(),
- name,
- StringCompare() );
-
- if( range.first != range.second )
- {
- int const seekOffs = header.abs_offset_of_data + (range.first->index*kSizeofDataRecord);
- f->seek( seekOffs, binio::Set );
- }
-
- SUsedList usedIns;
- usedIns.name = name;
-
- if( range.first != range.second )
- {
- read_rol_instrument( f, usedIns.instrument );
- }
- else
- {
- // set up default instrument data here
- memset( &usedIns.instrument, 0, sizeof(SRolInstrument) );
- }
- ins_list.push_back( usedIns );
-
- return ins_list.size()-1;
-}
-//---------------------------------------------------------
-int CrolPlayer::get_ins_index( std::string const &name ) const
-{
- for(unsigned int i=0; i<ins_list.size(); ++i)
- {
- if( strcasecmp(ins_list[i].name.c_str(), name.c_str()) == 0 )
- {
- return i;
- }
- }
-
- return -1;
-}
-//---------------------------------------------------------
-void CrolPlayer::read_rol_instrument( binistream *f, SRolInstrument &ins )
-{
- ins.mode = f->readInt(1);
- ins.voice_number = f->readInt(1);
-
- read_fm_operator( f, ins.modulator );
- read_fm_operator( f, ins.carrier );
-
- ins.modulator.waveform = f->readInt(1);
- ins.carrier.waveform = f->readInt(1);
-}
-//---------------------------------------------------------
-void CrolPlayer::read_fm_operator( binistream *f, SOPL2Op &opl2_op )
-{
- SFMOperator fm_op;
-
- fm_op.key_scale_level = f->readInt(1);
- fm_op.freq_multiplier = f->readInt(1);
- fm_op.feed_back = f->readInt(1);
- fm_op.attack_rate = f->readInt(1);
- fm_op.sustain_level = f->readInt(1);
- fm_op.sustaining_sound = f->readInt(1);
- fm_op.decay_rate = f->readInt(1);
- fm_op.release_rate = f->readInt(1);
- fm_op.output_level = f->readInt(1);
- fm_op.amplitude_vibrato = f->readInt(1);
- fm_op.frequency_vibrato = f->readInt(1);
- fm_op.envelope_scaling = f->readInt(1);
- fm_op.fm_type = f->readInt(1);
-
- opl2_op.ammulti = fm_op.amplitude_vibrato << 7 | fm_op.frequency_vibrato << 6 | fm_op.sustaining_sound << 5 | fm_op.envelope_scaling << 4 | fm_op.freq_multiplier;
- opl2_op.ksltl = fm_op.key_scale_level << 6 | fm_op.output_level;
- opl2_op.ardr = fm_op.attack_rate << 4 | fm_op.decay_rate;
- opl2_op.slrr = fm_op.sustain_level << 4 | fm_op.release_rate;
- opl2_op.fbc = fm_op.feed_back << 1 | (fm_op.fm_type ^ 1);
-}
diff --git a/src/adplug/core/rol.h b/src/adplug/core/rol.h
deleted file mode 100644
index eed9c34..0000000
--- a/src/adplug/core/rol.h
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * rol.h - ROL Player by OPLx <oplx@yahoo.com>
- *
- * Visit: http://tenacity.hispeed.com/aomit/oplx/
- */
-#ifndef H_ROLPLAYER
-#define H_ROLPLAYER
-
-#include <vector>
-#include <string>
-#include <strings.h>
-
-#include "player.h"
-
-class CrolPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CrolPlayer(Copl *newopl);
-
- ~CrolPlayer();
-
- bool load (const std::string &filename, const CFileProvider &fp);
- bool update ();
- void rewind (int subsong); // rewinds to specified subsong
- float getrefresh(); // returns needed timer refresh rate
-
- std::string gettype() { return std::string("Adlib Visual Composer"); }
-
-private:
- typedef unsigned short uint16;
- typedef signed short int16;
-#ifdef __x86_64__
- typedef signed int int32;
-#else
- typedef signed long int int32;
-#endif
- typedef float real32;
-
- typedef struct
- {
- uint16 version_major;
- uint16 version_minor;
- char unused0[40];
- uint16 ticks_per_beat;
- uint16 beats_per_measure;
- uint16 edit_scale_y;
- uint16 edit_scale_x;
- char unused1;
- char mode;
- char unused2[90];
- char filler0[38];
- char filler1[15];
- real32 basic_tempo;
- } SRolHeader;
-
- typedef struct
- {
- int16 time;
- real32 multiplier;
- } STempoEvent;
-
- typedef struct
- {
- int16 number;
- int16 duration;
- } SNoteEvent;
-
- typedef struct
- {
- int16 time;
- char name[9];
- int16 ins_index;
- } SInstrumentEvent;
-
- typedef struct
- {
- int16 time;
- real32 multiplier;
- } SVolumeEvent;
-
- typedef struct
- {
- int16 time;
- real32 variation;
- } SPitchEvent;
-
- typedef std::vector<SNoteEvent> TNoteEvents;
- typedef std::vector<SInstrumentEvent> TInstrumentEvents;
- typedef std::vector<SVolumeEvent> TVolumeEvents;
- typedef std::vector<SPitchEvent> TPitchEvents;
-
-#define bit_pos( pos ) (1<<pos)
-
- class CVoiceData
- {
- public:
- enum EEventStatus
- {
- kES_NoteEnd = bit_pos( 0 ),
- kES_PitchEnd = bit_pos( 1 ),
- kES_InstrEnd = bit_pos( 2 ),
- kES_VolumeEnd = bit_pos( 3 ),
-
- kES_None = 0
- };
-
- explicit CVoiceData()
- : mForceNote ( true )
- ,mEventStatus ( kES_None )
- ,current_note ( 0 )
- ,current_note_duration( 0 )
- ,mNoteDuration ( 0 )
- ,next_instrument_event( 0 )
- ,next_volume_event ( 0 )
- ,next_pitch_event ( 0 )
- {
- }
-
- void Reset()
- {
- mForceNote = true;
- mEventStatus = kES_None;
- current_note = 0;
- current_note_duration = 0;
- mNoteDuration = 0;
- next_instrument_event = 0;
- next_volume_event = 0;
- next_pitch_event = 0;
- }
-
- TNoteEvents note_events;
- TInstrumentEvents instrument_events;
- TVolumeEvents volume_events;
- TPitchEvents pitch_events;
-
- bool mForceNote : 1;
- int mEventStatus;
- unsigned int current_note;
- int current_note_duration;
- int mNoteDuration;
- unsigned int next_instrument_event;
- unsigned int next_volume_event;
- unsigned int next_pitch_event;
- };
-
- typedef struct
- {
- uint16 index;
- char record_used;
- char name[9];
- } SInstrumentName;
-
- typedef std::vector<SInstrumentName> TInstrumentNames;
-
- typedef struct
- {
- char version_major;
- char version_minor;
- char signature[6];
- uint16 number_of_list_entries_used;
- uint16 total_number_of_list_entries;
- int32 abs_offset_of_name_list;
- int32 abs_offset_of_data;
-
- TInstrumentNames ins_name_list;
- } SBnkHeader;
-
- typedef struct
- {
- unsigned char key_scale_level;
- unsigned char freq_multiplier;
- unsigned char feed_back;
- unsigned char attack_rate;
- unsigned char sustain_level;
- unsigned char sustaining_sound;
- unsigned char decay_rate;
- unsigned char release_rate;
- unsigned char output_level;
- unsigned char amplitude_vibrato;
- unsigned char frequency_vibrato;
- unsigned char envelope_scaling;
- unsigned char fm_type;
- } SFMOperator;
-
- typedef struct
- {
- unsigned char ammulti;
- unsigned char ksltl;
- unsigned char ardr;
- unsigned char slrr;
- unsigned char fbc;
- unsigned char waveform;
- } SOPL2Op;
-
- typedef struct
- {
- char mode;
- char voice_number;
- SOPL2Op modulator;
- SOPL2Op carrier;
- } SRolInstrument;
-
- typedef struct
- {
- std::string name;
- SRolInstrument instrument;
- } SUsedList;
-
- void load_tempo_events ( binistream *f );
- bool load_voice_data ( binistream *f, std::string const &bnk_filename, const CFileProvider &fp );
- void load_note_events ( binistream *f, CVoiceData &voice );
- void load_instrument_events( binistream *f, CVoiceData &voice,
- binistream *bnk_file, SBnkHeader const &bnk_header );
- void load_volume_events ( binistream *f, CVoiceData &voice );
- void load_pitch_events ( binistream *f, CVoiceData &voice );
-
- bool load_bnk_info ( binistream *f, SBnkHeader &header );
- int load_rol_instrument ( binistream *f, SBnkHeader const &header, std::string &name );
- void read_rol_instrument ( binistream *f, SRolInstrument &ins );
- void read_fm_operator ( binistream *f, SOPL2Op &opl2_op );
- int get_ins_index( std::string const &name ) const;
-
- void UpdateVoice( int const voice, CVoiceData &voiceData );
- void SetNote( int const voice, int const note );
- void SetNoteMelodic( int const voice, int const note );
- void SetNotePercussive( int const voice, int const note );
- void SetFreq ( int const voice, int const note, bool const keyOn=false );
- void SetPitch ( int const voice, real32 const variation );
- void SetVolume ( int const voice, int const volume );
- void SetRefresh( float const multiplier );
- void send_ins_data_to_chip( int const voice, int const ins_index );
- void send_operator( int const voice, SOPL2Op const &modulator, SOPL2Op const &carrier );
-
- class StringCompare
- {
- public:
- bool operator()( SInstrumentName const &lhs, SInstrumentName const &rhs ) const
- {
- return keyLess(lhs.name, rhs.name);
- }
-
- bool operator()( SInstrumentName const &lhs, std::string const &rhs ) const
- {
- return keyLess(lhs.name, rhs.c_str());
- }
-
- bool operator()( std::string const &lhs, SInstrumentName const &rhs ) const
- {
- return keyLess(lhs.c_str(), rhs.name);
- }
- private:
- bool keyLess( const char *const lhs, const char *const rhs ) const
- {
- return strcasecmp(lhs, rhs) < 0;
- }
- };
-
- typedef std::vector<CVoiceData> TVoiceData;
-
- SRolHeader *rol_header;
- std::vector<STempoEvent> mTempoEvents;
- TVoiceData voice_data;
- std::vector<SUsedList> ins_list;
-
- unsigned int mNextTempoEvent;
- int mCurrTick;
- int mTimeOfLastNote;
- float mRefresh;
- unsigned char bdRegister;
- unsigned char bxRegister[9];
- unsigned char volumeCache[11];
- uint16 freqCache[11];
- real32 pitchCache[11];
-
- static int const kSizeofDataRecord;
- static int const kMaxTickBeat;
- static int const kSilenceNote;
- static int const kNumMelodicVoices;
- static int const kNumPercussiveVoices;
- static int const kBassDrumChannel;
- static int const kSnareDrumChannel;
- static int const kTomtomChannel;
- static int const kTomtomFreq;
- static int const kSnareDrumFreq;
- static float const kDefaultUpdateTme;
- static float const kPitchFactor;
- static uint16 const kNoteTable[12];
-};
-
-#endif
diff --git a/src/adplug/core/s3m.cc b/src/adplug/core/s3m.cc
deleted file mode 100644
index f4ea7c6..0000000
--- a/src/adplug/core/s3m.cc
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * s3m.c - S3M Player by Simon Peter <dn.tlp@gmx.net>
- *
- * BUGS:
- * Extra Fine Slides (EEx, FEx) & Fine Vibrato (Uxy) are inaccurate
- */
-
-#include <cstring>
-#include "s3m.h"
-
-const signed char Cs3mPlayer::chnresolv[] = // S3M -> adlib channel conversion
- {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,-1,-1,-1,-1,-1,-1,-1};
-
-const unsigned short Cs3mPlayer::notetable[12] = // S3M adlib note table
- {340,363,385,408,432,458,485,514,544,577,611,647};
-
-const unsigned char Cs3mPlayer::vibratotab[32] = // vibrato rate table
- {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
-
-/*** public methods *************************************/
-
-CPlayer *Cs3mPlayer::factory(Copl *newopl)
-{
- return new Cs3mPlayer(newopl);
-}
-
-Cs3mPlayer::Cs3mPlayer(Copl *newopl): CPlayer(newopl)
-{
- int i,j,k;
-
- memset(pattern,255,sizeof(pattern));
- memset(orders,255,sizeof(orders));
-
- for(i=0;i<99;i++) // setup pattern
- for(j=0;j<64;j++)
- for(k=0;k<32;k++) {
- pattern[i][j][k].instrument = 0;
- pattern[i][j][k].info = 0;
- }
-}
-
-bool Cs3mPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- unsigned short insptr[99],pattptr[99];
- int i,row;
- unsigned char bufval,bufval2;
- unsigned short ppatlen;
- s3mheader *checkhead;
- bool adlibins=false;
-
- // file validation section
- checkhead = new s3mheader;
- load_header(f, checkhead);
- if(checkhead->kennung != 0x1a || checkhead->typ != 16
- || checkhead->insnum > 99) {
- delete checkhead; fp.close(f); return false;
- } else
- if(strncmp(checkhead->scrm,"SCRM",4)) {
- delete checkhead; fp.close(f); return false;
- } else { // is an adlib module?
- f->seek(checkhead->ordnum, binio::Add);
- for(i = 0; i < checkhead->insnum; i++)
- insptr[i] = f->readInt(2);
- for(i=0;i<checkhead->insnum;i++) {
- f->seek(insptr[i]*16);
- if(f->readInt(1) >= 2) {
- adlibins = true;
- break;
- }
- }
- delete checkhead;
- if(!adlibins) { fp.close(f); return false; }
- }
-
- // load section
- f->seek(0); // rewind for load
- load_header(f, &header); // read header
-
- // security check
- if(header.ordnum > 256 || header.insnum > 99 || header.patnum > 99) {
- fp.close(f);
- return false;
- }
-
- for(i = 0; i < header.ordnum; i++) orders[i] = f->readInt(1); // read orders
- for(i = 0; i < header.insnum; i++) insptr[i] = f->readInt(2); // instrument parapointers
- for(i = 0; i < header.patnum; i++) pattptr[i] = f->readInt(2); // pattern parapointers
-
- for(i=0;i<header.insnum;i++) { // load instruments
- f->seek(insptr[i]*16);
- inst[i].type = f->readInt(1);
- f->readString(inst[i].filename, 15);
- inst[i].d00 = f->readInt(1); inst[i].d01 = f->readInt(1);
- inst[i].d02 = f->readInt(1); inst[i].d03 = f->readInt(1);
- inst[i].d04 = f->readInt(1); inst[i].d05 = f->readInt(1);
- inst[i].d06 = f->readInt(1); inst[i].d07 = f->readInt(1);
- inst[i].d08 = f->readInt(1); inst[i].d09 = f->readInt(1);
- inst[i].d0a = f->readInt(1); inst[i].d0b = f->readInt(1);
- inst[i].volume = f->readInt(1); inst[i].dsk = f->readInt(1);
- f->ignore(2);
- inst[i].c2spd = f->readInt(4);
- f->ignore(12);
- f->readString(inst[i].name, 28);
- f->readString(inst[i].scri, 4);
- }
-
- for(i=0;i<header.patnum;i++) { // depack patterns
- f->seek(pattptr[i]*16);
- ppatlen = f->readInt(2);
- unsigned long pattpos = f->pos();
- for(row=0;(row<64) && (pattpos-pattptr[i]*16<=ppatlen);row++)
- do {
- bufval = f->readInt(1);
- if(bufval & 32) {
- bufval2 = f->readInt(1);
- pattern[i][row][bufval & 31].note = bufval2 & 15;
- pattern[i][row][bufval & 31].oct = (bufval2 & 240) >> 4;
- pattern[i][row][bufval & 31].instrument = f->readInt(1);
- }
- if(bufval & 64)
- pattern[i][row][bufval & 31].volume = f->readInt(1);
- if(bufval & 128) {
- pattern[i][row][bufval & 31].command = f->readInt(1);
- pattern[i][row][bufval & 31].info = f->readInt(1);
- }
- } while(bufval);
- }
-
- fp.close(f);
- rewind(0);
- return true; // done
-}
-
-bool Cs3mPlayer::update()
-{
- unsigned char pattbreak=0,donote; // remember vars
- unsigned char pattnr,chan,row,info; // cache vars
- signed char realchan;
-
- // effect handling (timer dependant)
- for(realchan=0; realchan<9; realchan++) {
- info = channel[realchan].info; // fill infobyte cache
- switch(channel[realchan].fx) {
- case 11:
- case 12: if(channel[realchan].fx == 11) // dual command: H00 and Dxy
- vibrato(realchan,channel[realchan].dualinfo);
- else // dual command: G00 and Dxy
- tone_portamento(realchan,channel[realchan].dualinfo);
- case 4: if(info <= 0x0f) { // volume slide down
- if(channel[realchan].vol - info >= 0)
- channel[realchan].vol -= info;
- else
- channel[realchan].vol = 0;
- }
- if((info & 0x0f) == 0) { // volume slide up
- if(channel[realchan].vol + (info >> 4) <= 63)
- channel[realchan].vol += info >> 4;
- else
- channel[realchan].vol = 63;
- }
- setvolume(realchan);
- break;
- case 5: if(info == 0xf0 || info <= 0xe0) { // slide down
- slide_down(realchan,info);
- setfreq(realchan);
- }
- break;
- case 6: if(info == 0xf0 || info <= 0xe0) { // slide up
- slide_up(realchan,info);
- setfreq(realchan);
- }
- break;
- case 7: tone_portamento(realchan,channel[realchan].dualinfo); break; // tone portamento
- case 8: vibrato(realchan,channel[realchan].dualinfo); break; // vibrato
- case 10: channel[realchan].nextfreq = channel[realchan].freq; // arpeggio
- channel[realchan].nextoct = channel[realchan].oct;
- switch(channel[realchan].trigger) {
- case 0: channel[realchan].freq = notetable[channel[realchan].note]; break;
- case 1: if(channel[realchan].note + ((info & 0xf0) >> 4) < 12)
- channel[realchan].freq = notetable[channel[realchan].note + ((info & 0xf0) >> 4)];
- else {
- channel[realchan].freq = notetable[channel[realchan].note + ((info & 0xf0) >> 4) - 12];
- channel[realchan].oct++;
- }
- break;
- case 2: if(channel[realchan].note + (info & 0x0f) < 12)
- channel[realchan].freq = notetable[channel[realchan].note + (info & 0x0f)];
- else {
- channel[realchan].freq = notetable[channel[realchan].note + (info & 0x0f) - 12];
- channel[realchan].oct++;
- }
- break;
- }
- if(channel[realchan].trigger < 2)
- channel[realchan].trigger++;
- else
- channel[realchan].trigger = 0;
- setfreq(realchan);
- channel[realchan].freq = channel[realchan].nextfreq;
- channel[realchan].oct = channel[realchan].nextoct;
- break;
- case 21: vibrato(realchan,(unsigned char) (info / 4)); break; // fine vibrato
- }
- }
-
- if(del) { // speed compensation
- del--;
- return !songend;
- }
-
- // arrangement handling
- pattnr = orders[ord];
- if(pattnr == 0xff || ord > header.ordnum) { // "--" end of song
- songend = 1; // set end-flag
- ord = 0;
- pattnr = orders[ord];
- if(pattnr == 0xff)
- return !songend;
- }
- if(pattnr == 0xfe) { // "++" skip marker
- ord++; pattnr = orders[ord];
- }
-
- // play row
- row = crow; // fill row cache
- for(chan=0;chan<32;chan++) {
- if(!(header.chanset[chan] & 128)) // resolve S3M -> AdLib channels
- realchan = chnresolv[header.chanset[chan] & 127];
- else
- realchan = -1; // channel disabled
- if(realchan != -1) { // channel playable?
- // set channel values
- donote = 0;
- if(pattern[pattnr][row][chan].note < 14) {
- // tone portamento
- if(pattern[pattnr][row][chan].command == 7 || pattern[pattnr][row][chan].command == 12) {
- channel[realchan].nextfreq = notetable[pattern[pattnr][row][chan].note];
- channel[realchan].nextoct = pattern[pattnr][row][chan].oct;
- } else { // normal note
- channel[realchan].note = pattern[pattnr][row][chan].note;
- channel[realchan].freq = notetable[pattern[pattnr][row][chan].note];
- channel[realchan].oct = pattern[pattnr][row][chan].oct;
- channel[realchan].key = 1;
- donote = 1;
- }
- }
- if(pattern[pattnr][row][chan].note == 14) { // key off (is 14 here, cause note is only first 4 bits)
- channel[realchan].key = 0;
- setfreq(realchan);
- }
- if((channel[realchan].fx != 8 && channel[realchan].fx != 11) && // vibrato begins
- (pattern[pattnr][row][chan].command == 8 || pattern[pattnr][row][chan].command == 11)) {
- channel[realchan].nextfreq = channel[realchan].freq;
- channel[realchan].nextoct = channel[realchan].oct;
- }
- if(pattern[pattnr][row][chan].note >= 14)
- if((channel[realchan].fx == 8 || channel[realchan].fx == 11) && // vibrato ends
- (pattern[pattnr][row][chan].command != 8 && pattern[pattnr][row][chan].command != 11)) {
- channel[realchan].freq = channel[realchan].nextfreq;
- channel[realchan].oct = channel[realchan].nextoct;
- setfreq(realchan);
- }
- if(pattern[pattnr][row][chan].instrument) { // set instrument
- channel[realchan].inst = pattern[pattnr][row][chan].instrument - 1;
- if(inst[channel[realchan].inst].volume < 64)
- channel[realchan].vol = inst[channel[realchan].inst].volume;
- else
- channel[realchan].vol = 63;
- if(pattern[pattnr][row][chan].command != 7)
- donote = 1;
- }
- if(pattern[pattnr][row][chan].volume != 255) {
- if(pattern[pattnr][row][chan].volume < 64) // set volume
- channel[realchan].vol = pattern[pattnr][row][chan].volume;
- else
- channel[realchan].vol = 63;
- }
- channel[realchan].fx = pattern[pattnr][row][chan].command; // set command
- if(pattern[pattnr][row][chan].info) // set infobyte
- channel[realchan].info = pattern[pattnr][row][chan].info;
-
- // some commands reset the infobyte memory
- switch(channel[realchan].fx) {
- case 1:
- case 2:
- case 3:
- case 20:
- channel[realchan].info = pattern[pattnr][row][chan].info;
- break;
- }
-
- // play note
- if(donote)
- playnote(realchan);
- if(pattern[pattnr][row][chan].volume != 255) // set volume
- setvolume(realchan);
-
- // command handling (row dependant)
- info = channel[realchan].info; // fill infobyte cache
- switch(channel[realchan].fx) {
- case 1: speed = info; break; // set speed
- case 2: if(info <= ord) songend = 1; ord = info; crow = 0; pattbreak = 1; break; // jump to order
- case 3: if(!pattbreak) { crow = info; ord++; pattbreak = 1; } break; // pattern break
- case 4: if(info > 0xf0) { // fine volume down
- if(channel[realchan].vol - (info & 0x0f) >= 0)
- channel[realchan].vol -= info & 0x0f;
- else
- channel[realchan].vol = 0;
- }
- if((info & 0x0f) == 0x0f && info >= 0x1f) { // fine volume up
- if(channel[realchan].vol + ((info & 0xf0) >> 4) <= 63)
- channel[realchan].vol += (info & 0xf0) >> 4;
- else
- channel[realchan].vol = 63;
- }
- setvolume(realchan);
- break;
- case 5: if(info > 0xf0) { // fine slide down
- slide_down(realchan,(unsigned char) (info & 0x0f));
- setfreq(realchan);
- }
- if(info > 0xe0 && info < 0xf0) { // extra fine slide down
- slide_down(realchan,(unsigned char) ((info & 0x0f) / 4));
- setfreq(realchan);
- }
- break;
- case 6: if(info > 0xf0) { // fine slide up
- slide_up(realchan,(unsigned char) (info & 0x0f));
- setfreq(realchan);
- }
- if(info > 0xe0 && info < 0xf0) { // extra fine slide up
- slide_up(realchan,(unsigned char) ((info & 0x0f) / 4));
- setfreq(realchan);
- }
- break;
- case 7: // tone portamento
- case 8:
- if((channel[realchan].fx == 7 || // vibrato (remember info for dual commands)
- channel[realchan].fx == 8) && pattern[pattnr][row][chan].info)
- channel[realchan].dualinfo = info;
- break;
- case 10: channel[realchan].trigger = 0; break; // arpeggio (set trigger)
- case 19:
- if(info == 0xb0) // set loop start
- loopstart = row;
- if(info > 0xb0 && info <= 0xbf) { // pattern loop
- if(!loopcnt) {
- loopcnt = info & 0x0f;
- crow = loopstart;
- pattbreak = 1;
- } else
- if(--loopcnt > 0) {
- crow = loopstart;
- pattbreak = 1;
- }
- }
- if((info & 0xf0) == 0xe0) // patterndelay
- del = speed * (info & 0x0f) - 1;
- break;
- case 20: tempo = info; break; // set tempo
- }
- }
- }
-
- if(!del)
- del = speed - 1; // speed compensation
- if(!pattbreak) { // next row (only if no manual advance)
- crow++;
- if(crow > 63) {
- crow = 0;
- ord++;
- loopstart = 0;
- }
- }
-
- return !songend; // still playing
-}
-
-void Cs3mPlayer::rewind(int subsong)
-{
- // set basic variables
- songend = 0; ord = 0; crow = 0; tempo = header.it;
- speed = header.is; del = 0; loopstart = 0; loopcnt = 0;
-
- memset(channel,0,sizeof(channel));
-
- opl->init(); // reset OPL chip
- opl->write(1,32); // Go to ym3812 mode
-}
-
-std::string Cs3mPlayer::gettype()
-{
- char filever[5];
-
- switch(header.cwtv) { // determine version number
- case 0x1300: strcpy(filever,"3.00"); break;
- case 0x1301: strcpy(filever,"3.01"); break;
- case 0x1303: strcpy(filever,"3.03"); break;
- case 0x1320: strcpy(filever,"3.20"); break;
- default: strcpy(filever,"3.??");
- }
-
- return (std::string("Scream Tracker ") + filever);
-}
-
-float Cs3mPlayer::getrefresh()
-{
- return (float) (tempo / 2.5);
-}
-
-/*** private methods *************************************/
-
-void Cs3mPlayer::load_header(binistream *f, s3mheader *h)
-{
- int i;
-
- f->readString(h->name, 28);
- h->kennung = f->readInt(1); h->typ = f->readInt(1);
- f->ignore(2);
- h->ordnum = f->readInt(2); h->insnum = f->readInt(2);
- h->patnum = f->readInt(2); h->flags = f->readInt(2);
- h->cwtv = f->readInt(2); h->ffi = f->readInt(2);
- f->readString(h->scrm, 4);
- h->gv = f->readInt(1); h->is = f->readInt(1); h->it = f->readInt(1);
- h->mv = f->readInt(1); h->uc = f->readInt(1); h->dp = f->readInt(1);
- f->ignore(8);
- h->special = f->readInt(2);
- for(i = 0; i < 32; i++) h->chanset[i] = f->readInt(1);
-}
-
-void Cs3mPlayer::setvolume(unsigned char chan)
-{
- unsigned char op = op_table[chan], insnr = channel[chan].inst;
-
- opl->write(0x43 + op,(int)(63-((63-(inst[insnr].d03 & 63))/63.0)*channel[chan].vol) + (inst[insnr].d03 & 192));
- if(inst[insnr].d0a & 1)
- opl->write(0x40 + op,(int)(63-((63-(inst[insnr].d02 & 63))/63.0)*channel[chan].vol) + (inst[insnr].d02 & 192));
-}
-
-void Cs3mPlayer::setfreq(unsigned char chan)
-{
- opl->write(0xa0 + chan, channel[chan].freq & 255);
- if(channel[chan].key)
- opl->write(0xb0 + chan, (((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2)) | 32);
- else
- opl->write(0xb0 + chan, ((channel[chan].freq & 768) >> 8) + (channel[chan].oct << 2));
-}
-
-void Cs3mPlayer::playnote(unsigned char chan)
-{
- unsigned char op = op_table[chan], insnr = channel[chan].inst;
-
- opl->write(0xb0 + chan, 0); // stop old note
-
- // set instrument data
- opl->write(0x20 + op, inst[insnr].d00);
- opl->write(0x23 + op, inst[insnr].d01);
- opl->write(0x40 + op, inst[insnr].d02);
- opl->write(0x43 + op, inst[insnr].d03);
- opl->write(0x60 + op, inst[insnr].d04);
- opl->write(0x63 + op, inst[insnr].d05);
- opl->write(0x80 + op, inst[insnr].d06);
- opl->write(0x83 + op, inst[insnr].d07);
- opl->write(0xe0 + op, inst[insnr].d08);
- opl->write(0xe3 + op, inst[insnr].d09);
- opl->write(0xc0 + chan, inst[insnr].d0a);
-
- // set frequency & play
- channel[chan].key = 1;
- setfreq(chan);
-}
-
-void Cs3mPlayer::slide_down(unsigned char chan, unsigned char amount)
-{
- if(channel[chan].freq - amount > 340)
- channel[chan].freq -= amount;
- else
- if(channel[chan].oct > 0) {
- channel[chan].oct--;
- channel[chan].freq = 684;
- } else
- channel[chan].freq = 340;
-}
-
-void Cs3mPlayer::slide_up(unsigned char chan, unsigned char amount)
-{
- if(channel[chan].freq + amount < 686)
- channel[chan].freq += amount;
- else
- if(channel[chan].oct < 7) {
- channel[chan].oct++;
- channel[chan].freq = 341;
- } else
- channel[chan].freq = 686;
-}
-
-void Cs3mPlayer::vibrato(unsigned char chan, unsigned char info)
-{
- unsigned char i,speed,depth;
-
- speed = info >> 4;
- depth = (info & 0x0f) / 2;
-
- for(i=0;i<speed;i++) {
- channel[chan].trigger++;
- while(channel[chan].trigger >= 64)
- channel[chan].trigger -= 64;
- if(channel[chan].trigger >= 16 && channel[chan].trigger < 48)
- slide_down(chan,(unsigned char) (vibratotab[channel[chan].trigger - 16] / (16-depth)));
- if(channel[chan].trigger < 16)
- slide_up(chan,(unsigned char) (vibratotab[channel[chan].trigger + 16] / (16-depth)));
- if(channel[chan].trigger >= 48)
- slide_up(chan,(unsigned char) (vibratotab[channel[chan].trigger - 48] / (16-depth)));
- }
- setfreq(chan);
-}
-
-void Cs3mPlayer::tone_portamento(unsigned char chan, unsigned char info)
-{
- if(channel[chan].freq + (channel[chan].oct << 10) < channel[chan].nextfreq +
- (channel[chan].nextoct << 10))
- slide_up(chan,info);
- if(channel[chan].freq + (channel[chan].oct << 10) > channel[chan].nextfreq +
- (channel[chan].nextoct << 10))
- slide_down(chan,info);
- setfreq(chan);
-}
diff --git a/src/adplug/core/s3m.h b/src/adplug/core/s3m.h
deleted file mode 100644
index 1c95c42..0000000
--- a/src/adplug/core/s3m.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * s3m.h - AdLib S3M Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_S3M
-#define H_ADPLUG_S3M
-
-#include "player.h"
-
-class Cs3mPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- Cs3mPlayer(Copl *newopl);
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle()
- { return std::string(header.name); };
-
- unsigned int getpatterns()
- { return header.patnum; };
- unsigned int getpattern()
- { return orders[ord]; };
- unsigned int getorders()
- { return (header.ordnum-1); };
- unsigned int getorder()
- { return ord; };
- unsigned int getrow()
- { return crow; };
- unsigned int getspeed()
- { return speed; };
- unsigned int getinstruments()
- { return header.insnum; };
- std::string getinstrument(unsigned int n)
- { return std::string(inst[n].name); };
-
- protected:
- struct s3mheader {
- char name[28]; // song name
- unsigned char kennung,typ,dummy[2];
- unsigned short ordnum,insnum,patnum,flags,cwtv,ffi;
- char scrm[4];
- unsigned char gv,is,it,mv,uc,dp,dummy2[8];
- unsigned short special;
- unsigned char chanset[32];
- };
-
- struct s3minst {
- unsigned char type;
- char filename[15];
- unsigned char d00,d01,d02,d03,d04,d05,d06,d07,d08,d09,d0a,d0b,volume,dsk,dummy[2];
- unsigned long c2spd;
- char dummy2[12], name[28],scri[4];
- } inst[99];
-
- struct {
- unsigned char note,oct,instrument,volume,command,info;
- } pattern[99][64][32];
-
- struct {
- unsigned short freq,nextfreq;
- unsigned char oct,vol,inst,fx,info,dualinfo,key,nextoct,trigger,note;
- } channel[9];
-
- s3mheader header;
- unsigned char orders[256];
- unsigned char crow,ord,speed,tempo,del,songend,loopstart,loopcnt;
-
- private:
- static const signed char chnresolv[];
- static const unsigned short notetable[12];
- static const unsigned char vibratotab[32];
-
- void load_header(binistream *f, s3mheader *h);
- void setvolume(unsigned char chan);
- void setfreq(unsigned char chan);
- void playnote(unsigned char chan);
- void slide_down(unsigned char chan, unsigned char amount);
- void slide_up(unsigned char chan, unsigned char amount);
- void vibrato(unsigned char chan, unsigned char info);
- void tone_portamento(unsigned char chan, unsigned char info);
-};
-
-#endif
diff --git a/src/adplug/core/sa2.cc b/src/adplug/core/sa2.cc
deleted file mode 100644
index d0f53c6..0000000
--- a/src/adplug/core/sa2.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2008 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * sa2.cpp - SAdT2 Loader by Simon Peter <dn.tlp@gmx.net>
- * SAdT Loader by Mamiya <mamiya@users.sourceforge.net>
- */
-
-#include <cstring>
-#include <stdio.h>
-#include <string.h>
-
-#include "sa2.h"
-#include "debug.h"
-
-CPlayer *Csa2Loader::factory(Copl *newopl)
-{
- return new Csa2Loader(newopl);
-}
-
-bool Csa2Loader::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- struct {
- unsigned char data[11],arpstart,arpspeed,arppos,arpspdcnt;
- } insts;
- unsigned char buf;
- int i,j, k, notedis = 0;
- const unsigned char convfx[16] = {0,1,2,3,4,5,6,255,8,255,10,11,12,13,255,15};
- unsigned char sat_type;
- enum SAT_TYPE {
- HAS_ARPEGIOLIST = (1 << 7),
- HAS_V7PATTERNS = (1 << 6),
- HAS_ACTIVECHANNELS = (1 << 5),
- HAS_TRACKORDER = (1 << 4),
- HAS_ARPEGIO = (1 << 3),
- HAS_OLDBPM = (1 << 2),
- HAS_OLDPATTERNS = (1 << 1),
- HAS_UNKNOWN127 = (1 << 0)
- };
-
- // read header
- f->readString(header.sadt, 4);
- header.version = f->readInt(1);
-
- // file validation section
- if(strncmp(header.sadt,"SAdT",4)) { fp.close(f); return false; }
- switch(header.version) {
- case 1:
- notedis = +0x18;
- sat_type = HAS_UNKNOWN127 | HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 2:
- notedis = +0x18;
- sat_type = HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 3:
- notedis = +0x0c;
- sat_type = HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 4:
- notedis = +0x0c;
- sat_type = HAS_ARPEGIO | HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 5:
- notedis = +0x0c;
- sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 6:
- sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_OLDPATTERNS | HAS_OLDBPM;
- break;
- case 7:
- sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_V7PATTERNS;
- break;
- case 8:
- sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER;
- break;
- case 9:
- sat_type = HAS_ARPEGIO | HAS_ARPEGIOLIST | HAS_TRACKORDER | HAS_ACTIVECHANNELS;
- break;
- default: /* unknown */
- fp.close(f);
- return false;
- }
-
- // load section
- // instruments
- for(i = 0; i < 31; i++) {
- if(sat_type & HAS_ARPEGIO) {
- for(j = 0; j < 11; j++) insts.data[j] = f->readInt(1);
- insts.arpstart = f->readInt(1);
- insts.arpspeed = f->readInt(1);
- insts.arppos = f->readInt(1);
- insts.arpspdcnt = f->readInt(1);
- inst[i].arpstart = insts.arpstart;
- inst[i].arpspeed = insts.arpspeed;
- inst[i].arppos = insts.arppos;
- inst[i].arpspdcnt = insts.arpspdcnt;
- } else {
- for(j = 0; j < 11; j++) insts.data[j] = f->readInt(1);
- inst[i].arpstart = 0;
- inst[i].arpspeed = 0;
- inst[i].arppos = 0;
- inst[i].arpspdcnt = 0;
- }
- for(j=0;j<11;j++)
- inst[i].data[j] = insts.data[j];
- inst[i].misc = 0;
- inst[i].slide = 0;
- }
-
- // instrument names
- for(i = 0; i < 29; i++) f->readString(instname[i], 17);
-
- f->ignore(3); // dummy bytes
- for(i = 0; i < 128; i++) order[i] = f->readInt(1); // pattern orders
- if(sat_type & HAS_UNKNOWN127) f->ignore(127);
-
- // infos
- nop = f->readInt(2); length = f->readInt(1); restartpos = f->readInt(1);
-
- // bpm
- bpm = f->readInt(2);
- if(sat_type & HAS_OLDBPM) {
- bpm = bpm * 125 / 50; // cps -> bpm
- }
-
- if(sat_type & HAS_ARPEGIOLIST) {
- init_specialarp();
- for(i = 0; i < 256; i++) arplist[i] = f->readInt(1); // arpeggio list
- for(i = 0; i < 256; i++) arpcmd[i] = f->readInt(1); // arpeggio commands
- }
-
- for(i=0;i<64;i++) { // track orders
- for(j=0;j<9;j++) {
- if(sat_type & HAS_TRACKORDER)
- trackord[i][j] = f->readInt(1);
- else
- {
- trackord[i][j] = i * 9 + j;
- }
- }
- }
-
- if(sat_type & HAS_ACTIVECHANNELS)
- activechan = f->readInt(2) << 16; // active channels
-
- AdPlug_LogWrite("Csa2Loader::load(\"%s\"): sat_type = %x, nop = %d, "
- "length = %lu, restartpos = %lu, activechan = %lx, bpm = %d\n",
- filename.c_str(), sat_type, nop, length, restartpos, activechan, bpm);
-
- // track data
- if(sat_type & HAS_OLDPATTERNS) {
- i = 0;
- while(!f->ateof()) {
- for(j=0;j<64;j++) {
- for(k=0;k<9;k++) {
- buf = f->readInt(1);
- tracks[i+k][j].note = buf ? (buf + notedis) : 0;
- tracks[i+k][j].inst = f->readInt(1);
- tracks[i+k][j].command = convfx[f->readInt(1) & 0xf];
- tracks[i+k][j].param1 = f->readInt(1);
- tracks[i+k][j].param2 = f->readInt(1);
- }
- }
- i+=9;
- }
- } else
- if(sat_type & HAS_V7PATTERNS) {
- i = 0;
- while(!f->ateof()) {
- for(j=0;j<64;j++) {
- for(k=0;k<9;k++) {
- buf = f->readInt(1);
- tracks[i+k][j].note = buf >> 1;
- tracks[i+k][j].inst = (buf & 1) << 4;
- buf = f->readInt(1);
- tracks[i+k][j].inst += buf >> 4;
- tracks[i+k][j].command = convfx[buf & 0x0f];
- buf = f->readInt(1);
- tracks[i+k][j].param1 = buf >> 4;
- tracks[i+k][j].param2 = buf & 0x0f;
- }
- }
- i+=9;
- }
- } else {
- i = 0;
- while(!f->ateof()) {
- for(j=0;j<64;j++) {
- buf = f->readInt(1);
- tracks[i][j].note = buf >> 1;
- tracks[i][j].inst = (buf & 1) << 4;
- buf = f->readInt(1);
- tracks[i][j].inst += buf >> 4;
- tracks[i][j].command = convfx[buf & 0x0f];
- buf = f->readInt(1);
- tracks[i][j].param1 = buf >> 4;
- tracks[i][j].param2 = buf & 0x0f;
- }
- i++;
- }
- }
- fp.close(f);
-
- // fix instrument names
- for(i=0;i<29;i++)
- for(j=0;j<17;j++)
- if(!instname[i][j])
- instname[i][j] = ' ';
-
- rewind(0); // rewind module
- return true;
-}
-
-std::string Csa2Loader::gettype()
-{
- char tmpstr[40];
-
- sprintf(tmpstr,"Surprise! Adlib Tracker 2 (version %d)",header.version);
- return std::string(tmpstr);
-}
-
-std::string Csa2Loader::gettitle()
-{
- char bufinst[29*17],buf[18];
- int i,ptr;
-
- // parse instrument names for song name
- memset(bufinst,'\0',29*17);
- for(i=0;i<29;i++) {
- buf[16] = ' '; buf[17] = '\0';
- memcpy(buf,instname[i]+1,16);
- for(ptr=16;ptr>0;ptr--)
- if(buf[ptr] == ' ')
- buf[ptr] = '\0';
- else {
- if(ptr<16)
- buf[ptr+1] = ' ';
- break;
- }
- strcat(bufinst,buf);
- }
-
- if(strchr(bufinst,'"'))
- return std::string(bufinst,strchr(bufinst,'"')-bufinst+1,strrchr(bufinst,'"')-strchr(bufinst,'"')-1);
- else
- return std::string();
-}
diff --git a/src/adplug/core/sa2.h b/src/adplug/core/sa2.h
deleted file mode 100644
index 100782a..0000000
--- a/src/adplug/core/sa2.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * sa2.h - SAdT2 Loader by Simon Peter <dn.tlp@gmx.net>
- * SAdT Loader by Mamiya <mamiya@users.sourceforge.net>
- */
-
-#include "protrack.h"
-
-class Csa2Loader: public CmodPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- Csa2Loader(Copl *newopl)
- : CmodPlayer(newopl)
- { }
-
- bool load(const std::string &filename, const CFileProvider &fp);
-
- std::string gettype();
- std::string gettitle();
- unsigned int getinstruments()
- { return 31; }
- std::string getinstrument(unsigned int n)
- {
- if(n < 29)
- return std::string(instname[n],1,16);
- else
- return std::string("-broken-");
- }
-
-private:
- struct sa2header {
- char sadt[4];
- unsigned char version;
- } header;
-
- char instname[29][17];
-};
diff --git a/src/adplug/core/silentopl.h b/src/adplug/core/silentopl.h
deleted file mode 100644
index 0df38d6..0000000
--- a/src/adplug/core/silentopl.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * silentopl.h - Silent OPL device, by Simon Peter (dn.tlp@gmx.net)
- */
-
-#include "opl.h"
-
-class CSilentopl: public Copl
-{
-public:
- void write(int reg, int val) {}
- void init() {}
-};
diff --git a/src/adplug/core/sng.cc b/src/adplug/core/sng.cc
deleted file mode 100644
index e34d65e..0000000
--- a/src/adplug/core/sng.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2002 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * sng.cpp - SNG Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <cstring>
-#include "sng.h"
-
-CPlayer *CsngPlayer::factory(Copl *newopl)
-{
- return new CsngPlayer(newopl);
-}
-
-bool CsngPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- int i;
-
- // load header
- f->readString(header.id, 4);
- header.length = f->readInt(2); header.start = f->readInt(2);
- header.loop = f->readInt(2); header.delay = f->readInt(1);
- header.compressed = f->readInt(1) ? true : false;
-
- // file validation section
- if(strncmp(header.id,"ObsM",4)) { fp.close(f); return false; }
-
- // load section
- header.length /= 2; header.start /= 2; header.loop /= 2;
- data = new Sdata [header.length];
- for(i = 0; i < header.length; i++) {
- data[i].val = f->readInt(1);
- data[i].reg = f->readInt(1);
- }
-
- rewind(0);
- fp.close(f);
- return true;
-}
-
-bool CsngPlayer::update()
-{
- if(header.compressed && del) {
- del--;
- return !songend;
- }
-
- while(data[pos].reg) {
- opl->write(data[pos].reg, data[pos].val);
- pos++;
- if(pos >= header.length) {
- songend = true;
- pos = header.loop;
- }
- }
-
- if(!header.compressed)
- opl->write(data[pos].reg, data[pos].val);
-
- if(data[pos].val) { del = data[pos].val - 1; pos++; }
- if(pos >= header.length) { songend = true; pos = header.loop; }
- return !songend;
-}
-
-void CsngPlayer::rewind(int subsong)
-{
- pos = header.start; del = header.delay; songend = false;
- opl->init(); opl->write(1,32); // go to OPL2 mode
-}
diff --git a/src/adplug/core/sng.h b/src/adplug/core/sng.h
deleted file mode 100644
index b7be3ba..0000000
--- a/src/adplug/core/sng.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2002 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * sng.h - SNG Player by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_SNGPLAYER
-#define H_ADPLUG_SNGPLAYER
-
-#include "player.h"
-
-class CsngPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CsngPlayer(Copl *newopl)
- : CPlayer(newopl), data(0)
- { };
- ~CsngPlayer()
- { if(data) delete [] data; };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh()
- { return 70.0f; };
-
- std::string gettype()
- { return std::string("SNG File Format"); };
-
-protected:
- struct {
- char id[4];
- unsigned short length,start,loop;
- unsigned char delay;
- bool compressed;
- } header;
-
- struct Sdata {
- unsigned char val,reg;
- } *data;
-
- unsigned char del;
- unsigned short pos;
- bool songend;
-};
-
-#endif
diff --git a/src/adplug/core/temuopl.cc b/src/adplug/core/temuopl.cc
deleted file mode 100644
index 930103e..0000000
--- a/src/adplug/core/temuopl.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * temuopl.cpp - Tatsuyuki Satoh's OPL2 emulator, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "temuopl.h"
-
-CTemuopl::CTemuopl(int rate, bool bit16, bool usestereo)
- : use16bit(bit16), stereo(usestereo)
-{
- opl = OPLCreate(OPL_TYPE_YM3812, 3579545, rate);
-}
-
-CTemuopl::~CTemuopl()
-{
- OPLDestroy(opl);
-}
-
-void CTemuopl::update(short *buf, int samples)
-{
- int i;
-
- if(use16bit) {
- YM3812UpdateOne(opl,buf,samples);
-
- if(stereo)
- for(i=samples-1;i>=0;i--) {
- buf[i*2] = buf[i];
- buf[i*2+1] = buf[i];
- }
- } else {
- short *tempbuf = new short[stereo ? samples*2 : samples];
- int i;
-
- YM3812UpdateOne(opl,tempbuf,samples);
-
- if(stereo)
- for(i=samples-1;i>=0;i--) {
- tempbuf[i*2] = tempbuf[i];
- tempbuf[i*2+1] = tempbuf[i];
- }
-
- for(i=0;i<(stereo ? samples*2 : samples);i++)
- ((char *)buf)[i] = (tempbuf[i] >> 8) ^ 0x80;
-
- delete [] tempbuf;
- }
-}
-
-void CTemuopl::write(int reg, int val)
-{
- OPLWrite(opl,0,reg);
- OPLWrite(opl,1,val);
-}
-
-void CTemuopl::init()
-{
- OPLResetChip(opl);
-}
diff --git a/src/adplug/core/temuopl.h b/src/adplug/core/temuopl.h
deleted file mode 100644
index b68b167..0000000
--- a/src/adplug/core/temuopl.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * temuopl.h - Tatsuyuki Satoh's OPL2 emulator, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#ifndef H_ADPLUG_TEMUOPL
-#define H_ADPLUG_TEMUOPL
-
-#include "opl.h"
-#include "fmopl.h"
-
-class CTemuopl: public Copl
-{
- public:
- CTemuopl(int rate, bool bit16, bool usestereo); // rate = sample rate
- virtual ~CTemuopl();
-
- void update(short *buf, int samples); // fill buffer
-
- // template methods
- void write(int reg, int val);
- void init();
-
- private:
- bool use16bit,stereo;
- FM_OPL *opl; // holds emulator data
-};
-
-#endif
diff --git a/src/adplug/core/u6m.cc b/src/adplug/core/u6m.cc
deleted file mode 100644
index d72ea09..0000000
--- a/src/adplug/core/u6m.cc
+++ /dev/null
@@ -1,934 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * u6m.cpp - Ultima 6 Music Player by Marc Winterrowd.
- * This code extends the Adlib Winamp plug-in by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "u6m.h"
-
-// Makes security checks on output buffer before writing
-#define SAVE_OUTPUT_ROOT(c, d, p) \
-if(p < d.size) \
- output_root(c, d.data, p); \
-else \
- return false;
-
-CPlayer *Cu6mPlayer::factory(Copl *newopl)
-{
- return new Cu6mPlayer(newopl);
-}
-
-bool Cu6mPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- // file validation section
- // this section only checks a few *necessary* conditions
- unsigned long filesize, decompressed_filesize;
- binistream *f;
-
- f = fp.open(filename); if(!f) return false;
- filesize = fp.filesize(f);
-
- if (filesize >= 6)
- {
- // check if the file has a valid pseudo-header
- unsigned char pseudo_header[6];
- f->readString((char *)pseudo_header, 6);
- decompressed_filesize = pseudo_header[0] + (pseudo_header[1] << 8);
-
- if (!( (pseudo_header[2]==0) && (pseudo_header[3]==0) &&
- (pseudo_header[4] + ((pseudo_header[5] & 0x1)<<8) == 0x100) &&
- (decompressed_filesize > (filesize-4)) ))
- {
- fp.close(f);
- return(false);
- }
- }
- else
- {
- fp.close(f);
- return(false);
- }
-
- // load section
- song_data = new unsigned char[decompressed_filesize];
- unsigned char* compressed_song_data = new unsigned char[filesize-3];
-
- f->seek(4);
- f->readString((char *)compressed_song_data, filesize - 4);
- fp.close(f);
-
- // attempt to decompress the song data
- // if unsuccessful, deallocate song_data[] on the spot, and return(false)
- data_block source, destination;
- source.size = filesize-4;
- source.data = compressed_song_data;
- destination.size = decompressed_filesize;
- destination.data = song_data;
-
- if (!lzw_decompress(source,destination))
- {
- delete[] compressed_song_data;
- delete[] song_data;
- return(false);
- }
-
- // deallocation section
- delete[] compressed_song_data;
-
- rewind(0);
- return (true);
-}
-
-
-bool Cu6mPlayer::update()
-{
- if (!driver_active)
- {
- driver_active = true;
- dec_clip(read_delay);
- if (read_delay == 0)
- {
- command_loop();
- }
-
- // on all Adlib channels: freq slide/vibrato, mute factor slide
- for (int i = 0; i < 9; i++)
- {
- if (channel_freq_signed_delta[i]!=0)
- // frequency slide + mute factor slide
- {
- // freq slide
- freq_slide(i);
-
- // mute factor slide
- if (carrier_mf_signed_delta[i]!=0)
- {
- mf_slide(i);
- }
- }
- else
- // vibrato + mute factor slide
- {
- // vibrato
- if ((vb_multiplier[i]!=0) && ((channel_freq[i].hi & 0x20)==0x20))
- {
- vibrato(i);
- }
-
- // mute factor slide
- if (carrier_mf_signed_delta[i]!=0)
- {
- mf_slide(i);
- }
- }
- }
-
- driver_active = false;
- }
-
- return !songend;
-}
-
-
-void Cu6mPlayer::rewind(int subsong)
-{
- played_ticks = 0;
- songend = false;
-
- // set the driver's internal variables
- byte_pair freq_word = {0,0};
-
- driver_active = false;
- song_pos = 0;
- loop_position = 0; // position of the loop point
- read_delay = 0; // delay (in timer ticks) before further song data is read
-
- for (int i = 0; i < 9; i++)
- {
- // frequency
- channel_freq_signed_delta[i] = 0;
- channel_freq[i] = freq_word; // Adlib freq settings for each channel
-
- // vibrato ("vb")
- vb_current_value[i] = 0;
- vb_double_amplitude[i] = 0;
- vb_multiplier[i] = 0;
- vb_direction_flag[i] = 0;
-
- // mute factor ("mf") == ~(volume)
- carrier_mf[i] = 0;
- carrier_mf_signed_delta[i] = 0;
- carrier_mf_mod_delay_backup[i] = 0;
- carrier_mf_mod_delay[i] = 0;
- }
-
- while (!subsong_stack.empty()) // empty subsong stack
- subsong_stack.pop();
-
- opl->init();
- out_adlib(1,32); // go to OPL2 mode
-}
-
-
-float Cu6mPlayer::getrefresh()
-{
- return ((float)60); // the Ultima 6 music driver expects to be called at 60 Hz
-}
-
-
-// ============================================================================================
-//
-//
-// Functions called by load()
-//
-//
-// ============================================================================================
-
-
-// decompress from memory to memory
-bool Cu6mPlayer::lzw_decompress(Cu6mPlayer::data_block source, Cu6mPlayer::data_block dest)
-{
- bool end_marker_reached = false;
- int codeword_size = 9;
- long bits_read = 0;
- int next_free_codeword = 0x102;
- int dictionary_size = 0x200;
- MyDict dictionary = MyDict();
- std::stack<unsigned char> root_stack;
-
- long bytes_written = 0;
-
- int cW;
- int pW = 0;
- unsigned char C;
-
- while (!end_marker_reached)
- {
- cW = get_next_codeword(bits_read, source.data, codeword_size);
- switch (cW)
- {
- // re-init the dictionary
- case 0x100:
- codeword_size = 9;
- next_free_codeword = 0x102;
- dictionary_size = 0x200;
- dictionary.reset();
- cW = get_next_codeword(bits_read, source.data, codeword_size);
- SAVE_OUTPUT_ROOT((unsigned char)cW, dest, bytes_written);
- break;
- // end of compressed file has been reached
- case 0x101:
- end_marker_reached = true;
- break;
- // (cW <> 0x100) && (cW <> 0x101)
- default:
- if (cW < next_free_codeword) // codeword is already in the dictionary
- {
- // create the string associated with cW (on the stack)
- get_string(cW,dictionary,root_stack);
- C = root_stack.top();
- // output the string represented by cW
- while (!root_stack.empty())
- {
- SAVE_OUTPUT_ROOT(root_stack.top(), dest, bytes_written);
- root_stack.pop();
- }
- // add pW+C to the dictionary
- dictionary.add(C,pW);
-
- next_free_codeword++;
- if (next_free_codeword >= dictionary_size)
- {
- if (codeword_size < max_codeword_length)
- {
- codeword_size += 1;
- dictionary_size *= 2;
- }
- }
- }
- else // codeword is not yet defined
- {
- // create the string associated with pW (on the stack)
- get_string(pW,dictionary,root_stack);
- C = root_stack.top();
- // output the string represented by pW
- while (!root_stack.empty())
- {
- SAVE_OUTPUT_ROOT(root_stack.top(), dest, bytes_written);
- root_stack.pop();
- }
- // output the char C
- SAVE_OUTPUT_ROOT(C, dest, bytes_written);
-
- // the new dictionary entry must correspond to cW
- // if it doesn't, something is wrong with the lzw-compressed data.
- if (cW != next_free_codeword)
- {
- /* printf("cW != next_free_codeword!\n");
- exit(-1); */
- return false;
- }
- // add pW+C to the dictionary
- dictionary.add(C,pW);
-
- next_free_codeword++;
- if (next_free_codeword >= dictionary_size)
- {
- if (codeword_size < max_codeword_length)
- {
- codeword_size += 1;
- dictionary_size *= 2;
- }
- }
- };
- break;
- }
- // shift roles - the current cW becomes the new pW
- pW = cW;
- }
-
- return(true); // indicate successful decompression
-}
-
-
-// --------------------
-// Additional functions
-// --------------------
-
-
-// Read the next code word from the source buffer
-int Cu6mPlayer::get_next_codeword (long& bits_read, unsigned char *source, int codeword_size)
-{
- unsigned char b0,b1,b2;
- int codeword;
-
- b0 = source[bits_read/8];
- b1 = source[bits_read/8+1];
- b2 = source[bits_read/8+2];
-
- codeword = ((b2 << 16) + (b1 << 8) + b0);
- codeword = codeword >> (bits_read % 8);
- switch (codeword_size)
- {
- case 0x9:
- codeword = codeword & 0x1ff;
- break;
- case 0xa:
- codeword = codeword & 0x3ff;
- break;
- case 0xb:
- codeword = codeword & 0x7ff;
- break;
- case 0xc:
- codeword = codeword & 0xfff;
- break;
- default:
- codeword = -1; // indicates that an error has occurred
- break;
- }
-
- bits_read += codeword_size;
- return (codeword);
-}
-
-
-// output a root to memory
-void Cu6mPlayer::output_root(unsigned char root, unsigned char *destination, long& position)
-{
- destination[position] = root;
- position++;
-}
-
-
-// output the string represented by a codeword
-void Cu6mPlayer::get_string(int codeword, Cu6mPlayer::MyDict& dictionary, std::stack<unsigned char>& root_stack)
-{
- unsigned char root;
- int current_codeword;
-
- current_codeword = codeword;
-
- while (current_codeword > 0xff)
- {
- root = dictionary.get_root(current_codeword);
- current_codeword = dictionary.get_codeword(current_codeword);
- root_stack.push(root);
- }
-
- // push the root at the leaf
- root_stack.push((unsigned char)current_codeword);
-}
-
-
-// ============================================================================================
-//
-//
-// Functions called by update()
-//
-//
-// ============================================================================================
-
-
-// This function reads the song data and executes the embedded commands.
-void Cu6mPlayer::command_loop()
-{
- unsigned char command_byte; // current command byte
- int command_nibble_hi; // command byte, bits 4-7
- int command_nibble_lo; // command byte, bite 0-3
- bool repeat_loop = true; //
-
- do
- {
- // extract low and high command nibbles
- command_byte = read_song_byte(); // implicitly increments song_pos
- command_nibble_hi = command_byte >> 4;
- command_nibble_lo = command_byte & 0xf;
-
- switch (command_nibble_hi)
- {
- case 0x0: command_0(command_nibble_lo); break;
- case 0x1: command_1(command_nibble_lo); break;
- case 0x2: command_2(command_nibble_lo); break;
- case 0x3: command_3(command_nibble_lo); break;
- case 0x4: command_4(command_nibble_lo); break;
- case 0x5: command_5(command_nibble_lo); break;
- case 0x6: command_6(command_nibble_lo); break;
- case 0x7: command_7(command_nibble_lo); break;
- case 0x8:
- switch (command_nibble_lo)
- {
- case 1: command_81(); break;
- case 2: command_82(); repeat_loop = false; break;
- case 3: command_83(); break;
- case 5: command_85(); break;
- case 6: command_86(); break;
- default: break; // maybe generate an error?
- }
- break;
- case 0xE: command_E(); break;
- case 0xF: command_F(); break;
- default: break; // maybe generate an error?
- }
-
- } while (repeat_loop);
-}
-
-
-// --------------------------------------------------------
-// The commands supported by the U6 music file format
-// --------------------------------------------------------
-
-// ----------------------------------------
-// Set octave and frequency, note off
-// Format: 0c nn
-// c = channel, nn = packed Adlib frequency
-// ----------------------------------------
-void Cu6mPlayer::command_0(int channel)
-{
- unsigned char freq_byte;
- byte_pair freq_word;
-
- freq_byte = read_song_byte();
- freq_word = expand_freq_byte(freq_byte);
- set_adlib_freq(channel,freq_word);
-}
-
-
-// ---------------------------------------------------
-// Set octave and frequency, old note off, new note on
-// Format: 1c nn
-// c = channel, nn = packed Adlib frequency
-// ---------------------------------------------------
-void Cu6mPlayer::command_1(int channel)
-{
- unsigned char freq_byte;
- byte_pair freq_word;
-
- vb_direction_flag[channel] = 0;
- vb_current_value[channel] = 0;
-
- freq_byte = read_song_byte();
- freq_word = expand_freq_byte(freq_byte);
- set_adlib_freq(channel,freq_word);
-
- freq_word.hi = freq_word.hi | 0x20; // note on
- set_adlib_freq(channel,freq_word);
-}
-
-
-// ----------------------------------------
-// Set octave and frequency, note on
-// Format: 2c nn
-// c = channel, nn = packed Adlib frequency
-// ----------------------------------------
-void Cu6mPlayer::command_2(int channel)
-{
- unsigned char freq_byte;
- byte_pair freq_word;
-
- freq_byte = read_song_byte();
- freq_word = expand_freq_byte(freq_byte);
- freq_word.hi = freq_word.hi | 0x20; // note on
- set_adlib_freq(channel,freq_word);
-}
-
-
-// --------------------------------------
-// Set "carrier mute factor"==not(volume)
-// Format: 3c nn
-// c = channel, nn = mute factor
-// --------------------------------------
-void Cu6mPlayer::command_3(int channel)
-{
- unsigned char mf_byte;
-
- carrier_mf_signed_delta[channel] = 0;
- mf_byte = read_song_byte();
- set_carrier_mf(channel,mf_byte);
-}
-
-
-// ----------------------------------------
-// set "modulator mute factor"==not(volume)
-// Format: 4c nn
-// c = channel, nn = mute factor
-// ----------------------------------------
-void Cu6mPlayer::command_4(int channel)
-{
- unsigned char mf_byte;
-
- mf_byte = read_song_byte();
- set_modulator_mf(channel,mf_byte);
-}
-
-
-// --------------------------------------------
-// Set portamento (pitch slide)
-// Format: 5c nn
-// c = channel, nn = signed channel pitch delta
-// --------------------------------------------
-void Cu6mPlayer::command_5(int channel)
-{
- channel_freq_signed_delta[channel] = read_signed_song_byte();
-}
-
-
-// --------------------------------------------
-// Set vibrato paramters
-// Format: 6c mn
-// c = channel
-// m = vibrato double amplitude
-// n = vibrato multiplier
-// --------------------------------------------
-void Cu6mPlayer::command_6(int channel)
-{
- unsigned char vb_parameters;
-
- vb_parameters = read_song_byte();
- vb_double_amplitude[channel] = vb_parameters >> 4; // high nibble
- vb_multiplier[channel] = vb_parameters & 0xF; // low nibble
-}
-
-
-// ----------------------------------------
-// Assign Adlib instrument to Adlib channel
-// Format: 7c nn
-// c = channel, nn = instrument number
-// ----------------------------------------
-void Cu6mPlayer::command_7(int channel)
-{
- int instrument_offset = instrument_offsets[read_song_byte()];
- out_adlib_opcell(channel, false, 0x20, *(song_data + instrument_offset+0));
- out_adlib_opcell(channel, false, 0x40, *(song_data + instrument_offset+1));
- out_adlib_opcell(channel, false, 0x60, *(song_data + instrument_offset+2));
- out_adlib_opcell(channel, false, 0x80, *(song_data + instrument_offset+3));
- out_adlib_opcell(channel, false, 0xE0, *(song_data + instrument_offset+4));
- out_adlib_opcell(channel, true, 0x20, *(song_data + instrument_offset+5));
- out_adlib_opcell(channel, true, 0x40, *(song_data + instrument_offset+6));
- out_adlib_opcell(channel, true, 0x60, *(song_data + instrument_offset+7));
- out_adlib_opcell(channel, true, 0x80, *(song_data + instrument_offset+8));
- out_adlib_opcell(channel, true, 0xE0, *(song_data + instrument_offset+9));
- out_adlib(0xC0+channel, *(song_data + instrument_offset+10));
-}
-
-
-// -------------------------------------------
-// Branch to a new subsong
-// Format: 81 nn aa bb
-// nn == number of times to repeat the subsong
-// aa == subsong offset (low byte)
-// bb == subsong offset (high byte)
-// -------------------------------------------
-void Cu6mPlayer::command_81()
-{
- subsong_info new_ss_info;
-
- new_ss_info.subsong_repetitions = read_song_byte();
- new_ss_info.subsong_start = read_song_byte(); new_ss_info.subsong_start += read_song_byte() << 8;
- new_ss_info.continue_pos = song_pos;
-
- subsong_stack.push(new_ss_info);
- song_pos = new_ss_info.subsong_start;
-}
-
-
-// ------------------------------------------------------------
-// Stop interpreting commands for this timer tick
-// Format: 82 nn
-// nn == delay (in timer ticks) until further data will be read
-// ------------------------------------------------------------
-void Cu6mPlayer::command_82()
-{
- read_delay = read_song_byte();
-}
-
-
-// -----------------------------
-// Adlib instrument data follows
-// Format: 83 nn <11 bytes>
-// nn == instrument number
-// -----------------------------
-void Cu6mPlayer::command_83()
-{
- unsigned char instrument_number = read_song_byte();
- instrument_offsets[instrument_number] = song_pos;
- song_pos += 11;
-}
-
-
-// ----------------------------------------------
-// Set -1 mute factor slide (upward volume slide)
-// Format: 85 cn
-// c == channel
-// n == slide delay
-// ----------------------------------------------
-void Cu6mPlayer::command_85()
-{
- unsigned char data_byte = read_song_byte();
- int channel = data_byte >> 4; // high nibble
- unsigned char slide_delay = data_byte & 0xF; // low nibble
- carrier_mf_signed_delta[channel] = +1;
- carrier_mf_mod_delay[channel] = slide_delay + 1;
- carrier_mf_mod_delay_backup[channel] = slide_delay + 1;
-}
-
-
-// ------------------------------------------------
-// Set +1 mute factor slide (downward volume slide)
-// Format: 86 cn
-// c == channel
-// n == slide speed
-// ------------------------------------------------
-void Cu6mPlayer::command_86()
-{
- unsigned char data_byte = read_song_byte();
- int channel = data_byte >> 4; // high nibble
- unsigned char slide_delay = data_byte & 0xF; // low nibble
- carrier_mf_signed_delta[channel] = -1;
- carrier_mf_mod_delay[channel] = slide_delay + 1;
- carrier_mf_mod_delay_backup[channel] = slide_delay + 1;
-}
-
-
-// --------------
-// Set loop point
-// Format: E?
-// --------------
-void Cu6mPlayer::command_E()
-{
- loop_position = song_pos;
-}
-
-
-// ---------------------------
-// Return from current subsong
-// Format: F?
-// ---------------------------
-void Cu6mPlayer::command_F()
-{
- if (!subsong_stack.empty())
- {
- subsong_info temp = subsong_stack.top();
- subsong_stack.pop();
- temp.subsong_repetitions--;
- if (temp.subsong_repetitions==0)
- {
- song_pos = temp.continue_pos;
- }
- else
- {
- song_pos = temp.subsong_start;
- subsong_stack.push(temp);
- }
- }
- else
- {
- song_pos = loop_position;
- songend = true;
- }
-}
-
-
-// --------------------
-// Additional functions
-// --------------------
-
-// This function decrements its argument, without allowing it to become negative.
-void Cu6mPlayer::dec_clip(int& param)
-{
- param--;
- if (param < 0) { param = 0; }
-}
-
-
-// Returns the byte at the current song position.
-// Side effect: increments song_pos.
-unsigned char Cu6mPlayer::read_song_byte()
-{
- unsigned char song_byte;
- song_byte = song_data[song_pos];
- song_pos++;
- return(song_byte);
-}
-
-
-// Same as read_song_byte(), except that it returns a signed byte
-signed char Cu6mPlayer::read_signed_song_byte()
-{
- unsigned char song_byte;
- int signed_value;
- song_byte = *(song_data + song_pos);
- song_pos++;
- if (song_byte <= 127)
- {
- signed_value = song_byte;
- }
- else
- {
- signed_value = (int)song_byte - 0x100;
- }
- return((signed char)signed_value);
-}
-
-
-Cu6mPlayer::byte_pair Cu6mPlayer::expand_freq_byte(unsigned char freq_byte)
-{
- const byte_pair freq_table[24] =
- {
- {0x00,0x00}, {0x58,0x01}, {0x82,0x01}, {0xB0,0x01},
- {0xCC,0x01}, {0x03,0x02}, {0x41,0x02}, {0x86,0x02},
- {0x00,0x00}, {0x6A,0x01}, {0x96,0x01}, {0xC7,0x01},
- {0xE4,0x01}, {0x1E,0x02}, {0x5F,0x02}, {0xA8,0x02},
- {0x00,0x00}, {0x47,0x01}, {0x6E,0x01}, {0x9A,0x01},
- {0xB5,0x01}, {0xE9,0x01}, {0x24,0x02}, {0x66,0x02}
- };
-
- int packed_freq;
- int octave;
- byte_pair freq_word;
-
- packed_freq = freq_byte & 0x1F;
- octave = freq_byte >> 5;
-
- // range check (not present in the original U6 music driver)
- if (packed_freq >= 24) { packed_freq = 0; }
-
- freq_word.hi = freq_table[packed_freq].hi + (octave << 2);
- freq_word.lo = freq_table[packed_freq].lo;
-
- return(freq_word);
-}
-
-
-void Cu6mPlayer::set_adlib_freq(int channel,Cu6mPlayer::byte_pair freq_word)
-{
- out_adlib(0xA0+channel,freq_word.lo);
- out_adlib(0xB0+channel,freq_word.hi);
- // update the Adlib register backups
- channel_freq[channel] = freq_word;
-}
-
-
-// this function sets the Adlib frequency, but does not update the register backups
-void Cu6mPlayer::set_adlib_freq_no_update(int channel,Cu6mPlayer::byte_pair freq_word)
-{
- out_adlib(0xA0+channel,freq_word.lo);
- out_adlib(0xB0+channel,freq_word.hi);
-}
-
-
-void Cu6mPlayer::set_carrier_mf(int channel,unsigned char mute_factor)
-{
- out_adlib_opcell(channel,true,0x40,mute_factor);
- carrier_mf[channel] = mute_factor;
-}
-
-
-void Cu6mPlayer::set_modulator_mf(int channel,unsigned char mute_factor)
-{
- out_adlib_opcell(channel,false,0x40,mute_factor);
-}
-
-
-void Cu6mPlayer::freq_slide(int channel)
-{
- byte_pair freq = channel_freq[channel];
-
- long freq_word = freq.lo + (freq.hi << 8) + channel_freq_signed_delta[channel];
- if (freq_word < 0) { freq_word += 0x10000; }
- if (freq_word > 0xFFFF) { freq_word -= 0x10000; }
-
- freq.lo = freq_word & 0xFF;
- freq.hi = (freq_word >> 8) & 0xFF;
- set_adlib_freq(channel,freq);
-}
-
-
-void Cu6mPlayer::vibrato(int channel)
-{
- byte_pair freq;
-
- if (vb_current_value[channel] >= vb_double_amplitude[channel])
- { vb_direction_flag[channel] = 1; }
- else if (vb_current_value[channel] <= 0)
- { vb_direction_flag[channel] = 0; }
-
- if (vb_direction_flag[channel]==0)
- { vb_current_value[channel]++; }
- else
- { vb_current_value[channel]--; }
-
- long freq_word = channel_freq[channel].lo + (channel_freq[channel].hi << 8);
- freq_word += (vb_current_value[channel] - (vb_double_amplitude[channel] >> 1))
- * vb_multiplier[channel];
- if (freq_word < 0) { freq_word += 0x10000; }
- if (freq_word > 0xFFFF) { freq_word -= 0x10000; }
-
- freq.lo = freq_word & 0xFF;
- freq.hi = (freq_word >> 8) & 0xFF;
- set_adlib_freq_no_update(channel,freq);
-}
-
-
-void Cu6mPlayer::mf_slide(int channel)
-{
- carrier_mf_mod_delay[channel]--;
- if (carrier_mf_mod_delay[channel]==0)
- {
- carrier_mf_mod_delay[channel] = carrier_mf_mod_delay_backup[channel];
- int current_mf = carrier_mf[channel] + carrier_mf_signed_delta[channel];
- if (current_mf > 0x3F)
- {
- current_mf = 0x3F;
- carrier_mf_signed_delta[channel] = 0;
- }
- else if (current_mf < 0)
- {
- current_mf = 0;
- carrier_mf_signed_delta[channel] = 0;
- }
-
- set_carrier_mf(channel,(unsigned char)current_mf);
- }
-}
-
-
-void Cu6mPlayer::out_adlib(unsigned char adlib_register, unsigned char adlib_data)
-{
- opl->write(adlib_register,adlib_data);
-}
-
-
-void Cu6mPlayer::out_adlib_opcell(int channel, bool carrier, unsigned char adlib_register, unsigned char out_byte)
-{
- const unsigned char adlib_channel_to_carrier_offset[9] =
- {0x03,0x04,0x05,0x0B,0x0C,0x0D,0x13,0x14,0x15};
- const unsigned char adlib_channel_to_modulator_offset[9] =
- {0x00,0x01,0x02,0x08,0x09,0x0A,0x10,0x11,0x12};
-
- if (carrier)
- {
- out_adlib(adlib_register+adlib_channel_to_carrier_offset[channel],out_byte);
- }
- else
- {
- out_adlib(adlib_register+adlib_channel_to_modulator_offset[channel],out_byte);
- }
-}
-
-
-// ============================================================================================
-//
-//
-// The Dictionary
-//
-//
-// ============================================================================================
-
-
-Cu6mPlayer::MyDict::MyDict()
-{
- dict_size = default_dict_size;
- dictionary = new dict_entry[dict_size-0x100]; // don't allocate space for the roots
- contains = 0x102;
-}
-
-
-Cu6mPlayer::MyDict::MyDict(int max_size)
-{
- dict_size = max_size;
- dictionary = new dict_entry[dict_size-0x100]; // don't allocate space for the roots
- contains = 0x102;
-}
-
-
-Cu6mPlayer::MyDict::~MyDict()
-{
- delete [] dictionary;
-}
-
-// re-initializes the dictionary
-void Cu6mPlayer::MyDict::reset()
-{
- contains = 0x102;
-}
-
-
-// Note: If the dictionary is already full, this function does nothing.
-void Cu6mPlayer::MyDict::add(unsigned char root, int codeword)
-{
- if (contains < dict_size)
- {
- dictionary[contains-0x100].root = root;
- dictionary[contains-0x100].codeword = codeword;
- contains++;
- }
-}
-
-
-unsigned char Cu6mPlayer::MyDict::get_root(int codeword)
-{
- return (dictionary[codeword-0x100].root);
-}
-
-
-int Cu6mPlayer::MyDict::get_codeword(int codeword)
-{
- return (dictionary[codeword-0x100].codeword);
-}
diff --git a/src/adplug/core/u6m.h b/src/adplug/core/u6m.h
deleted file mode 100644
index cd593e5..0000000
--- a/src/adplug/core/u6m.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * u6m.h - Ultima 6 Music Player by Marc Winterrowd.
- * This code extends the Adlib Winamp plug-in by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <stack>
-
-#include "player.h"
-
-#define default_dict_size 4096 // because maximum codeword size == 12 bits
-#define max_codeword_length 12 // maximum codeword length in bits
-
-class Cu6mPlayer: public CPlayer
-{
- public:
- static CPlayer *factory(Copl *newopl);
-
- Cu6mPlayer(Copl *newopl) : CPlayer(newopl), song_data(0)
- {
- };
-
-
- ~Cu6mPlayer()
- {
- if(song_data) delete[] song_data;
- };
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype()
- {
- return std::string("Ultima 6 Music");
- };
-
- protected:
-
- struct byte_pair
- {
- unsigned char lo;
- unsigned char hi;
- };
-
- struct subsong_info // information about a subsong
- {
- int continue_pos;
- int subsong_repetitions;
- int subsong_start;
- };
-
- struct dict_entry // dictionary entry
- {
- unsigned char root;
- int codeword;
- };
-
- struct data_block //
- {
- long size;
- unsigned char *data;
- };
-
- class MyDict
- {
- private:
- // The actual number of dictionary entries allocated
- // is (dictionary_size-256), because there are 256 roots
- // that do not need to be stored.
- int contains; // number of entries currently in the dictionary
- int dict_size; // max number of entries that will fit into the dictionary
- dict_entry* dictionary;
-
- public:
- MyDict(); // use dictionary size of 4096
- MyDict(int); // let the caller specify a dictionary size
- ~MyDict();
- void reset(); // re-initializes the dictionary
- void add(unsigned char, int);
- unsigned char get_root(int);
- int get_codeword(int);
- };
-
-
- // class variables
- long played_ticks;
-
- unsigned char* song_data; // the uncompressed .m file (the "song")
- bool driver_active; // flag to prevent reentrancy
- bool songend; // indicates song end
- int song_pos; // current offset within the song
- int loop_position; // position of the loop point
- int read_delay; // delay (in timer ticks) before further song data is read
- std::stack<subsong_info> subsong_stack;
-
- int instrument_offsets[9]; // offsets of the adlib instrument data
- // vibrato ("vb")
- unsigned char vb_current_value[9];
- unsigned char vb_double_amplitude[9];
- unsigned char vb_multiplier[9];
- unsigned char vb_direction_flag[9];
- // mute factor ("mf") = not(volume)
- unsigned char carrier_mf[9];
- signed char carrier_mf_signed_delta[9];
- unsigned char carrier_mf_mod_delay_backup[9];
- unsigned char carrier_mf_mod_delay[9];
- // frequency
- byte_pair channel_freq[9]; // adlib freq settings for each channel
- signed char channel_freq_signed_delta[9];
-
- // protected functions used by update()
- void command_loop();
- unsigned char read_song_byte();
- signed char read_signed_song_byte();
- void dec_clip(int&);
- byte_pair expand_freq_byte(unsigned char);
- void set_adlib_freq(int channel,byte_pair freq_word);
- void set_adlib_freq_no_update(int channel,byte_pair freq_word);
- void set_carrier_mf(int channel,unsigned char mute_factor);
- void set_modulator_mf(int channel,unsigned char mute_factor);
- void freq_slide(int channel);
- void vibrato(int channel);
- void mf_slide(int channel);
-
- void command_0(int channel);
- void command_1(int channel);
- void command_2(int channel);
- void command_3(int channel);
- void command_4(int channel);
- void command_5(int channel);
- void command_6(int channel);
- void command_7(int channel);
- void command_81();
- void command_82();
- void command_83();
- void command_85();
- void command_86();
- void command_E();
- void command_F();
-
- void out_adlib(unsigned char adlib_register, unsigned char adlib_data);
- void out_adlib_opcell(int channel, bool carrier, unsigned char adlib_register, unsigned char out_byte);
-
- // protected functions used by load()
- bool lzw_decompress(data_block source, data_block dest);
- int get_next_codeword (long& bits_read, unsigned char *source, int codeword_size);
- void output_root(unsigned char root, unsigned char *destination, long& position);
- void get_string(int codeword, MyDict& dictionary, std::stack<unsigned char>& root_stack);
-};
-
diff --git a/src/adplug/core/xad.cc b/src/adplug/core/xad.cc
deleted file mode 100644
index a84ed43..0000000
--- a/src/adplug/core/xad.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- Adplug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- xad.cpp - XAD shell player by Riven the Mage <riven@ok.ru>
-*/
-
-#include "xad.h"
-#include "debug.h"
-
-/* -------- Public Methods -------------------------------- */
-
-CxadPlayer::CxadPlayer(Copl * newopl) : CPlayer(newopl)
-{
- tune = 0;
-}
-
-CxadPlayer::~CxadPlayer()
-{
- if (tune)
- delete [] tune;
-}
-
-bool CxadPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- bool ret = false;
-
- // load header
- xad.id = f->readInt(4);
- f->readString(xad.title, 36);
- f->readString(xad.author, 36);
- xad.fmt = f->readInt(2);
- xad.speed = f->readInt(1);
- xad.reserved_a = f->readInt(1);
-
- // 'XAD!' - signed ?
- if(xad.id != 0x21444158) { fp.close(f); return false; }
-
- // get file size
- tune_size = fp.filesize(f) - 80;
-
- // load()
- tune = new unsigned char [tune_size];
- f->readString((char *)tune, tune_size);
- fp.close(f);
-
- ret = xadplayer_load();
-
- if (ret)
- rewind(0);
-
- return ret;
-}
-
-void CxadPlayer::rewind(int subsong)
-{
- opl->init();
-
- plr.speed = xad.speed;
- plr.speed_counter = 1;
- plr.playing = 1;
- plr.looping = 0;
-
- // rewind()
- xadplayer_rewind(subsong);
-
-#ifdef DEBUG
- AdPlug_LogWrite("-----------\n");
-#endif
-}
-
-bool CxadPlayer::update()
-{
- if (--plr.speed_counter)
- goto update_end;
-
- plr.speed_counter = plr.speed;
-
- // update()
- xadplayer_update();
-
-update_end:
- return (plr.playing && (!plr.looping));
-}
-
-float CxadPlayer::getrefresh()
-{
- return xadplayer_getrefresh();
-}
-
-std::string CxadPlayer::gettype()
-{
- return xadplayer_gettype();
-}
-
-std::string CxadPlayer::gettitle()
-{
- return xadplayer_gettitle();
-}
-
-std::string CxadPlayer::getauthor()
-{
- return xadplayer_getauthor();
-}
-
-std::string CxadPlayer::getinstrument(unsigned int i)
-{
- return xadplayer_getinstrument(i);
-}
-
-unsigned int CxadPlayer::getinstruments()
-{
- return xadplayer_getinstruments();
-}
-
-/* -------- Protected Methods ------------------------------- */
-
-void CxadPlayer::opl_write(int reg, int val)
-{
- adlib[reg] = val;
-#ifdef DEBUG
- AdPlug_LogWrite("[ %02X ] = %02X\n",reg,val);
-#endif
- opl->write(reg,val);
-}
diff --git a/src/adplug/core/xad.h b/src/adplug/core/xad.h
deleted file mode 100644
index 68401fa..0000000
--- a/src/adplug/core/xad.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- AdPlug - Replayer for many OPL2/OPL3 audio file formats.
- Copyright (C) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- xad.h - XAD shell player by Riven the Mage <riven@ok.ru>
-*/
-
-#ifndef H_ADPLUG_XAD
-#define H_ADPLUG_XAD
-
-#include "player.h"
-
-class CxadPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl);
-
- CxadPlayer(Copl * newopl);
- ~CxadPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype();
- std::string gettitle();
- std::string getauthor();
- std::string getinstrument(unsigned int i);
- unsigned int getinstruments();
-
-protected:
- virtual void xadplayer_rewind(int subsong) = 0;
- virtual bool xadplayer_load() = 0;
- virtual void xadplayer_update() = 0;
- virtual float xadplayer_getrefresh() = 0;
- virtual std::string xadplayer_gettype() = 0;
- virtual std::string xadplayer_gettitle()
- {
- return std::string(xad.title);
- }
- virtual std::string xadplayer_getauthor()
- {
- return std::string(xad.author);
- }
- virtual std::string xadplayer_getinstrument(unsigned int i)
- {
- return std::string("");
- }
- virtual unsigned int xadplayer_getinstruments()
- {
- return 0;
- }
-
- enum { HYP=1, PSI, FLASH, BMF, RAT, HYBRID };
-
- struct xad_header
- {
- unsigned long id;
- char title[36];
- char author[36];
- unsigned short fmt;
- unsigned char speed;
- unsigned char reserved_a;
- } xad;
-
- unsigned char * tune;
- unsigned long tune_size;
-
- struct
- {
- int playing;
- int looping;
- unsigned char speed;
- unsigned char speed_counter;
- } plr;
-
- unsigned char adlib[256];
-
- void opl_write(int reg, int val);
-};
-
-#endif
diff --git a/src/adplug/core/xsm.cc b/src/adplug/core/xsm.cc
deleted file mode 100644
index 34c6b29..0000000
--- a/src/adplug/core/xsm.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * xsm.cpp - eXtra Simple Music Player, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include <string.h>
-
-#include "xsm.h"
-
-CxsmPlayer::CxsmPlayer(Copl *newopl)
- : CPlayer(newopl), music(0)
-{
-}
-
-CxsmPlayer::~CxsmPlayer()
-{
- if(music) delete [] music;
-}
-
-bool CxsmPlayer::load(const std::string &filename, const CFileProvider &fp)
-{
- binistream *f = fp.open(filename); if(!f) return false;
- char id[6];
- int i, j;
-
- // check if header matches
- f->readString(id, 6); songlen = f->readInt(2);
- if(strncmp(id, "ofTAZ!", 6) || songlen > 3200) { fp.close(f); return false; }
-
- // read and set instruments
- for(i = 0; i < 9; i++) {
- opl->write(0x20 + op_table[i], f->readInt(1));
- opl->write(0x23 + op_table[i], f->readInt(1));
- opl->write(0x40 + op_table[i], f->readInt(1));
- opl->write(0x43 + op_table[i], f->readInt(1));
- opl->write(0x60 + op_table[i], f->readInt(1));
- opl->write(0x63 + op_table[i], f->readInt(1));
- opl->write(0x80 + op_table[i], f->readInt(1));
- opl->write(0x83 + op_table[i], f->readInt(1));
- opl->write(0xe0 + op_table[i], f->readInt(1));
- opl->write(0xe3 + op_table[i], f->readInt(1));
- opl->write(0xc0 + op_table[i], f->readInt(1));
- f->ignore(5);
- }
-
- // read song data
- music = new char [songlen * 9];
- for(i = 0; i < 9; i++)
- for(j = 0; j < songlen; j++)
- music[j * 9 + i] = f->readInt(1);
-
- // success
- fp.close(f);
- rewind(0);
- return true;
-}
-
-bool CxsmPlayer::update()
-{
- int c;
-
- if(notenum >= songlen) {
- songend = true;
- notenum = last = 0;
- }
-
- for(c = 0; c < 9; c++)
- if(music[notenum * 9 + c] != music[last * 9 + c])
- opl->write(0xb0 + c, 0);
-
- for(c = 0; c < 9; c++) {
- if(music[notenum * 9 + c])
- play_note(c, music[notenum * 9 + c] % 12, music[notenum * 9 + c] / 12);
- else
- play_note(c, 0, 0);
- }
-
- last = notenum;
- notenum++;
- return !songend;
-}
-
-void CxsmPlayer::rewind(int subsong)
-{
- notenum = last = 0;
- songend = false;
-}
-
-float CxsmPlayer::getrefresh()
-{
- return 5.0f;
-}
-
-void CxsmPlayer::play_note(int c, int note, int octv)
-{
- int freq = note_table[note];
-
- if(!note && !octv) freq = 0;
- opl->write(0xa0 + c, freq & 0xff);
- opl->write(0xb0 + c, (freq / 0xff) | 32 | (octv * 4));
-}
diff --git a/src/adplug/core/xsm.h b/src/adplug/core/xsm.h
deleted file mode 100644
index e7cf7c7..0000000
--- a/src/adplug/core/xsm.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Adplug - Replayer for many OPL2/OPL3 audio file formats.
- * Copyright (C) 1999 - 2003 Simon Peter, <dn.tlp@gmx.net>, et al.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * xsm.h - eXtra Simple Music Player, by Simon Peter <dn.tlp@gmx.net>
- */
-
-#include "player.h"
-
-class CxsmPlayer: public CPlayer
-{
-public:
- static CPlayer *factory(Copl *newopl) { return new CxsmPlayer(newopl); }
-
- CxsmPlayer(Copl *newopl);
- ~CxsmPlayer();
-
- bool load(const std::string &filename, const CFileProvider &fp);
- bool update();
- void rewind(int subsong);
- float getrefresh();
-
- std::string gettype() { return std::string("eXtra Simple Music"); }
-
-private:
- unsigned short songlen;
- char *music;
- unsigned int last, notenum;
- bool songend;
-
- void play_note(int c, int note, int octv);
-};