aboutsummaryrefslogtreecommitdiff
path: root/tfmx
diff options
context:
space:
mode:
authorNorbert Lange2009-07-01 23:11:56 +0000
committerNorbert Lange2009-07-01 23:11:56 +0000
commit9f8d9de11db887801940a042c59da9591b120bf5 (patch)
treec37cee8ea09630b6b0ed012a0d71d17370858891 /tfmx
parent7c7ad0d5f139e24a56da22123376452c87535669 (diff)
downloadscummvm-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.mk1
-rw-r--r--tfmx/mxtxplayer.cpp214
-rw-r--r--tfmx/tfmxplayer.cpp7
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)