diff options
Diffstat (limited to 'audio/mods/module_mod_xm_s3m.h')
-rw-r--r-- | audio/mods/module_mod_xm_s3m.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/audio/mods/module_mod_xm_s3m.h b/audio/mods/module_mod_xm_s3m.h new file mode 100644 index 0000000000..d92ac6679c --- /dev/null +++ b/audio/mods/module_mod_xm_s3m.h @@ -0,0 +1,174 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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. + * + */ + +/* + * This code is based on IBXM mod player + * + * Copyright (c) 2015, Martin Cameron + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the + * following conditions are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * * Neither the name of the organization nor the names of + * its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef AUDIO_MODS_MODULE_MOD_XM_S3M_H +#define AUDIO_MODS_MODULE_MOD_XM_S3M_H + +#include "common/scummsys.h" + +namespace Common { +class SeekableReadStream; +} + +namespace Modules { + +struct Note { + byte key; + byte instrument; + byte volume; + byte effect; // effect type + byte param; // parameter of effect +}; + +struct Pattern { + int numChannels, numRows; + Note *notes; + + Note getNote(int row, int chan) { + Note res; + if (row >= 0 && chan >= 0 && row < numRows && chan < numChannels) + res = notes[row * numChannels + chan]; + else + memset(&res, 0, sizeof(struct Note)); + return res; + } +}; + +struct Sample { + char name[32]; // sample name + int16 finetune; // fine tune + int16 volume; // volume + int length; // loop start + int loopStart; // loop start + int loopLength; // loop length + int16 panning; + int16 relNote; + int16 *data; +}; + +struct Envelope { + byte enabled, sustain, looped, numPoints; + uint16 sustainTick, loopStartTick, loopEndTick; + uint16 pointsTick[16], pointsAmpl[16]; +}; + +struct Instrument { + int numSamples, volFadeout; + char name[32], keyToSample[97]; + int8 vibType, vibSweep, vibDepth, vibRate; + Envelope volEnv, panEnv; + Sample *samples; +}; + +struct ModuleModXmS3m { + +private: + static const int FP_SHIFT; + static const int FP_ONE; + static const int FP_MASK; + static const int exp2table[]; + +public: + // sound properties + byte name[32]; + int sequenceLen; + int restartPos; + byte *sequence; + + // patterns + int numChannels; + int numPatterns; + Pattern *patterns; + + // instruments + int numInstruments; + Instrument *instruments; + + // others + int defaultGvol, defaultSpeed, defaultTempo, c2Rate, gain; + bool linearPeriods, fastVolSlides; + byte *defaultPanning; + + ModuleModXmS3m(); + ~ModuleModXmS3m(); + + bool load(Common::SeekableReadStream &stream); + + // math functions + static int log2(int x); + static int exp2(int x); + +private: + bool loadMod(Common::SeekableReadStream &stream); + bool loadXm(Common::SeekableReadStream &stream); + bool loadS3m(Common::SeekableReadStream &stream); + + void readSampleSint8(Common::SeekableReadStream &stream, int length, int16 *dest); + void readSampleSint16LE(Common::SeekableReadStream &stream, int length, int16 *dest); + + void SamplePingPong(Sample &sample); +}; + +} // End of namespace Modules + +#endif |