mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-22 01:57:16 +00:00
215 lines
5.6 KiB
C++
215 lines
5.6 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
/*
|
|
* VGMTrans (c) 2002-2019
|
|
* Licensed under the zlib license,
|
|
* refer to the included VGMTrans_LICENSE.txt file
|
|
*/
|
|
#ifndef AUDIO_SOUNDFONT_VGMITEM_H
|
|
#define AUDIO_SOUNDFONT_VGMITEM_H
|
|
|
|
#include "common/scummsys.h"
|
|
#include "common/str.h"
|
|
#include "common/array.h"
|
|
#include "rawfile.h"
|
|
#include "synthfile.h"
|
|
|
|
class RawFile;
|
|
|
|
//template <class T>
|
|
class VGMFile;
|
|
class VGMItem;
|
|
class VGMHeader;
|
|
|
|
class VGMItem {
|
|
public:
|
|
VGMItem();
|
|
VGMItem(VGMFile *thevgmfile, uint32 theOffset, uint32 theLength = 0,
|
|
const Common::String theName = "");
|
|
virtual ~VGMItem(void);
|
|
|
|
public:
|
|
RawFile *GetRawFile();
|
|
|
|
protected:
|
|
// TODO make inline
|
|
uint32 GetBytes(uint32 nIndex, uint32 nCount, void *pBuffer);
|
|
uint8 GetByte(uint32 offset);
|
|
uint16 GetShort(uint32 offset);
|
|
|
|
public:
|
|
VGMFile *_vgmfile;
|
|
Common::String _name;
|
|
uint32 _dwOffset; // offset in the pDoc data buffer
|
|
uint32 _unLength; // num of bytes the event engulfs
|
|
};
|
|
|
|
class VGMContainerItem : public VGMItem {
|
|
public:
|
|
VGMContainerItem();
|
|
VGMContainerItem(VGMFile *thevgmfile, uint32 theOffset, uint32 theLength = 0,
|
|
const Common::String theName = "");
|
|
virtual ~VGMContainerItem(void);
|
|
|
|
VGMHeader *AddHeader(uint32 offset, uint32 length, const Common::String &name = "Header");
|
|
|
|
void AddSimpleItem(uint32 offset, uint32 length, const Common::String &theName);
|
|
|
|
template<class T>
|
|
void AddContainer(Common::Array<T *> &container) {
|
|
_containers.push_back(reinterpret_cast<Common::Array<VGMItem *> *>(&container));
|
|
}
|
|
|
|
public:
|
|
Common::Array<VGMHeader *> _headers;
|
|
Common::Array<Common::Array<VGMItem *> *> _containers;
|
|
Common::Array<VGMItem *> _localitems;
|
|
};
|
|
|
|
class VGMColl;
|
|
|
|
class VGMFile : public VGMContainerItem {
|
|
public:
|
|
|
|
public:
|
|
VGMFile(RawFile *theRawFile, uint32 offset, uint32 length = 0,
|
|
Common::String theName = "VGM File");
|
|
virtual ~VGMFile();
|
|
|
|
bool LoadVGMFile();
|
|
virtual bool Load() = 0;
|
|
|
|
RawFile *GetRawFile();
|
|
|
|
size_t size() const { return _unLength; }
|
|
Common::String name() const { return _name; }
|
|
|
|
uint32 GetBytes(uint32 nIndex, uint32 nCount, void *pBuffer);
|
|
|
|
inline uint8 GetByte(uint32 offset) const { return _rawfile->GetByte(offset); }
|
|
inline uint16 GetShort(uint32 offset) const { return _rawfile->GetShort(offset); }
|
|
inline uint32 GetWord(uint32 offset) const { return _rawfile->GetWord(offset); }
|
|
/*
|
|
* For whatever reason, you can create null-length VGMItems.
|
|
* The only safe way for now is to
|
|
* assume maximum length
|
|
*/
|
|
size_t GetEndOffset() { return _rawfile->size(); }
|
|
|
|
const char *data() const { return _rawfile->data() + _dwOffset; }
|
|
|
|
RawFile *_rawfile;
|
|
};
|
|
|
|
// *********
|
|
// VGMHeader
|
|
// *********
|
|
|
|
class VGMHeader : public VGMContainerItem {
|
|
public:
|
|
VGMHeader(VGMItem *parItem, uint32 offset = 0, uint32 length = 0,
|
|
const Common::String &name = "Header");
|
|
virtual ~VGMHeader();
|
|
};
|
|
|
|
class VGMInstr;
|
|
class VGMRgnItem;
|
|
class VGMSampColl;
|
|
|
|
// ******
|
|
// VGMRgn
|
|
// ******
|
|
|
|
class VGMRgn : public VGMContainerItem {
|
|
public:
|
|
VGMRgn(VGMInstr *instr, uint32 offset, uint32 length = 0, Common::String name = "Region");
|
|
~VGMRgn();
|
|
|
|
virtual bool LoadRgn() { return true; }
|
|
|
|
void AddGeneralItem(uint32 offset, uint32 length, const Common::String &name);
|
|
void SetFineTune(int16 relativePitchCents) { _fineTune = relativePitchCents; }
|
|
void SetPan(uint8 pan);
|
|
void AddPan(uint8 pan, uint32 offset, uint32 length = 1);
|
|
void AddVolume(double volume, uint32 offset, uint32 length = 1);
|
|
void AddUnityKey(int8 unityKey, uint32 offset, uint32 length = 1);
|
|
void AddKeyLow(uint8 keyLow, uint32 offset, uint32 length = 1);
|
|
void AddKeyHigh(uint8 keyHigh, uint32 offset, uint32 length = 1);
|
|
void AddSampNum(int sampNum, uint32 offset, uint32 length = 1);
|
|
|
|
VGMInstr *_parInstr;
|
|
uint8 _keyLow;
|
|
uint8 _keyHigh;
|
|
uint8 _velLow;
|
|
uint8 _velHigh;
|
|
|
|
int8 _unityKey;
|
|
short _fineTune;
|
|
|
|
Loop _loop;
|
|
|
|
int _sampNum;
|
|
VGMSampColl *_sampCollPtr;
|
|
|
|
double _volume; /* Percentage of full volume */
|
|
double _pan; /* Left 0 <- 0.5 Center -> 1 Right */
|
|
double _attack_time; /* In seconds */
|
|
double _decay_time; /* In seconds */
|
|
double _release_time; /* In seconds */
|
|
double _sustain_level; /* Percentage */
|
|
double _sustain_time; /* In seconds (no positive rate!) */
|
|
|
|
uint16 _attack_transform;
|
|
uint16 _release_transform;
|
|
|
|
Common::Array<VGMRgnItem *> _items;
|
|
};
|
|
|
|
// **********
|
|
// VGMRgnItem
|
|
// **********
|
|
|
|
class VGMRgnItem : public VGMItem {
|
|
public:
|
|
enum RgnItemType {
|
|
RIT_GENERIC,
|
|
RIT_UNKNOWN,
|
|
RIT_UNITYKEY,
|
|
RIT_FINETUNE,
|
|
RIT_KEYLOW,
|
|
RIT_KEYHIGH,
|
|
RIT_VELLOW,
|
|
RIT_VELHIGH,
|
|
RIT_PAN,
|
|
RIT_VOL,
|
|
RIT_SAMPNUM
|
|
};
|
|
|
|
VGMRgnItem(VGMRgn *rgn, RgnItemType theType, uint32 offset, uint32 length,
|
|
const Common::String &name);
|
|
|
|
public:
|
|
RgnItemType _type;
|
|
};
|
|
|
|
#endif // AUDIO_SOUNDFONT_VGMITEM_H
|