diff options
author | Norbert Lange | 2009-07-01 23:11:56 +0000 |
---|---|---|
committer | Norbert Lange | 2009-07-01 23:11:56 +0000 |
commit | 9f8d9de11db887801940a042c59da9591b120bf5 (patch) | |
tree | c37cee8ea09630b6b0ed012a0d71d17370858891 /tfmx | |
parent | 7c7ad0d5f139e24a56da22123376452c87535669 (diff) | |
download | scummvm-rg350-9f8d9de11db887801940a042c59da9591b120bf5.tar.gz scummvm-rg350-9f8d9de11db887801940a042c59da9591b120bf5.tar.bz2 scummvm-rg350-9f8d9de11db887801940a042c59da9591b120bf5.zip |
added a skeleton for maxtrax modules. Not much happening yet, just reading and displaying a bit of information for maxtrax file
svn-id: r42013
Diffstat (limited to 'tfmx')
-rw-r--r-- | tfmx/module.mk | 1 | ||||
-rw-r--r-- | tfmx/mxtxplayer.cpp | 214 | ||||
-rw-r--r-- | tfmx/tfmxplayer.cpp | 7 |
3 files changed, 219 insertions, 3 deletions
diff --git a/tfmx/module.mk b/tfmx/module.mk index 41d114bfb0..5227ae7e7e 100644 --- a/tfmx/module.mk +++ b/tfmx/module.mk @@ -1,6 +1,7 @@ MODULE := tfmx MODULE_OBJS := \ + mxtxplayer.o \ tfmxplayer.o \ tfmxdebug.o diff --git a/tfmx/mxtxplayer.cpp b/tfmx/mxtxplayer.cpp new file mode 100644 index 0000000000..b7f59a3327 --- /dev/null +++ b/tfmx/mxtxplayer.cpp @@ -0,0 +1,214 @@ +#include "common/scummsys.h" +#include "common/system.h" +#include "common/stream.h" +#include "common/file.h" +#include "common/fs.h" +#include "common/endian.h" +#include "common/debug.h" + +#include "sound/mixer.h" +#include "sound/mods/maxtrax.h" + +#if defined(MXTX_CMDLINE_TOOL) + +// #include "tfmx/tfmxdebug.h" + +#define FILEDIR "" + +using namespace Common; + +#define MUSICFILE "introscr.mx" + +bool load(Common::SeekableReadStream &musicData) { + bool res = false; + + char buf[2 * 1024]; + uint16 tempo, flags; + uint16 numScores; + + // 0x0000: 4 Bytes Header "MXTX" + // 0x0004: uint16 tempo + // 0x0006: uint16 flags. bit0 = lowpassfilter, bit1 = attackvolume, bit15 = microtonal + musicData.read(buf, 4); + tempo = musicData.readUint16BE(); + flags = musicData.readUint16BE(); + buf[4] = '\0'; + debug("Header: %s %02X %02X", buf, tempo, flags); + + if (flags & (1 << 15)) { + // uint16 microtonal[128] + musicData.skip(128 * 2); + } + + // uint16 number of Scores + numScores = musicData.readUint16BE(); + debug("#Scores: %d", numScores); + int scoresLoaded = 0; + byte *scorePtr; // array of scorestructures + for (int i = 0; i < numScores; ++i) { + uint32 numEvents = musicData.readUint32BE(); + uint32 dataLength = numEvents * 6; + const int scoremax = 128; // some variable which is set upon initialisation of player + if (scoresLoaded < scoremax) { + // allocate dataLength zeroed bytes + // increase _globaldata+glob_TotalScores and _maxtrax+mxtx_TotalScores + // load events data + debug("score %i: %i Events", scoresLoaded, numEvents); + for (int j = 0; j < numEvents; ++j) { + byte command, data; + uint16 startTime, stopTime; + command = musicData.readByte(); + data = musicData.readByte(); + startTime = musicData.readUint16BE(); + stopTime = musicData.readUint16BE(); + debug("cmd, data, start, stop: %02X, %02X, %04X, %04X", command, data, startTime, stopTime); + + } + debug(""); + // store pointer to events and # events in scorePtr, then increase scorePtr by structsize + scoresLoaded++; + } else + musicData.skip(dataLength); + } + + uint16 numSamples; + // uint16 number of Samples + numSamples = numSamples.readUint16BE(); + for (int i = 0; i < numSamples; ++i) { + // load disksample structure + uint16 number = musicData.readUint16BE(); + uint16 tune = musicData.readUint16BE(); + uint16 volume = musicData.readUint16BE(); + uint16 octaves = musicData.readUint16BE(); + uint32 attackLen = musicData.readUint32BE(); + uint32 sustainLen = musicData.readUint32BE(); + uint16 attackCount = musicData.readUint16BE(); + uint16 releaseCount = musicData.readUint16BE(); + + byte *samplePtr = 0; // samplestructure ptrs + samplePtr += number; + + byte *patchPtr = 0; // array of patchstructs + patchPtr += number; + + // Tune and Volume Info + // copy tune, volume to patch_Tune, patch_Volume + + // Attack Segment + int attacksize = attackCount * 4; + // allocate attacksize bytes + // store allocated Ptr in patch_Attack + // store attackCount in patch_AttackCount + + // read attack segment + for (int j = 0; j < attackCount; ++j) { + uint16 envDuration = musicData.readUint16BE(); + uint16 envVolume = musicData.readUint16BE(); + // store into patch_Attack + } + + // Release Segment + int releasesize = releaseCount * 4; + // allocate releasesize bytes + // store allocated Ptr in patch_Release + // store attackCount in patch_ReleaseCount + + // read release segment + for (int j = 0; j < releaseCount; ++j) { + uint16 envDuration = musicData.readUint16BE(); + uint16 envVolume = musicData.readUint16BE(); + // store into patch_Release + } + + + + + + + + + + + + + + } + + /* + + STRUCTURE PatchData,0 + APTR patch_Sample ; Amiga sample data + APTR patch_Attack ; array of env. segments + APTR patch_Release ; array of env. segments + WORD patch_AttackCount ; number of attack env. + WORD patch_ReleaseCount ; number of release env. + WORD patch_Volume ; sample volume + WORD patch_Tune ; sample tuning + BYTE patch_Number ; self-identifing + BYTE patch_pad + LABEL patch_sizeof + + STRUCTURE DiskSample,0 + WORD dsamp_Number + WORD dsamp_Tune + WORD dsamp_Volume + WORD dsamp_Octaves + LONG dsamp_AttackLength + LONG dsamp_SustainLength + WORD dsamp_AttackCount + WORD dsamp_ReleaseCount + LABEL dsamp_sizeof + + STRUCTURE CookedEvent,0 + BYTE cev_Command + BYTE cev_Data + WORD cev_StartTime + WORD cev_StopTime + LABEL cev_sizeof + + STRUCTURE EnvelopeData,0 + WORD env_Duration ; duration in milliseconds + WORD env_Volume ; volume of envelope + LABEL env_sizeof + + STRUCTURE SampleData,0 + APTR samp_NextSample + APTR samp_Waveform + LONG samp_AttackSize + LONG samp_SustainSize + LABEL samp_sizeof + */ + return res; +} + +void *loadMtmxfile(const char *mdatName) { + FSNode fileDir(FILEDIR); + FSNode musicNode = fileDir.getChild(mdatName); + SeekableReadStream *musicIn = musicNode.createReadStream(); + if (0 == musicIn) { + debug("Couldnt load file %s", mdatName); + return 0; + } + + load(*musicIn); + + + delete musicIn; + + return 0; +} + +void modcmdmain(const int argc, const char *const argv[]) { + debug("Started Scumm&VM"); + debug("Sound celebrating utility for malcoms menace & Various Malfunctions"); + debug(""); + + loadMtmxfile(MUSICFILE); + +#ifdef _MSC_VER + printf("\npress a key"); + getc(stdin); +#endif +} + +#endif // #if defined(MXTX_CMDLINE_TOOL)
\ No newline at end of file diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp index efc3ce68b1..7dddb9fd88 100644 --- a/tfmx/tfmxplayer.cpp +++ b/tfmx/tfmxplayer.cpp @@ -7,9 +7,10 @@ #include "common/debug.h" #include "sound/mixer.h" -#include "sound/mods/protracker.h" #include "sound/mods/tfmx.h" +#if defined(TFMX_CMDLINE_TOOL) + #include "tfmx/tfmxdebug.h" #define FILEDIR "" @@ -46,7 +47,7 @@ Audio::Tfmx *loadTfmxfile(const char *mdatName, const char *sampleName) { void runFlac(int chan, int bits, int sr, const char *fileName); -void tfmxmain(const int argc, const char *const argv[]) { +void modcmdmain(const int argc, const char *const argv[]) { debug("Started Scumm&VM"); debug("Sound celebrating utility for monkey melodies & Various Malfunctions"); debug(""); @@ -167,4 +168,4 @@ void runFlac( int chan, int bits, int sr, const char *fileName) { system(cmd); } - +#endif // #if defined(TFMX_CMDLINE_TOOL) |