aboutsummaryrefslogtreecommitdiff
path: root/engines/igor/midi.h
diff options
context:
space:
mode:
authorGregory Montoir2007-11-18 06:25:23 +0000
committerGregory Montoir2007-11-18 06:25:23 +0000
commit0867e09a8129775de703516ca37108237b5d5c77 (patch)
tree34c092df2fb0db11eed2d478e7c84f880bb75a7a /engines/igor/midi.h
parentc0cebe93bb189d0aa94ceb9fc9eca26a8b2242e4 (diff)
downloadscummvm-rg350-0867e09a8129775de703516ca37108237b5d5c77.tar.gz
scummvm-rg350-0867e09a8129775de703516ca37108237b5d5c77.tar.bz2
scummvm-rg350-0867e09a8129775de703516ca37108237b5d5c77.zip
- added CTMF music support
- fixed dialogue in PART12 svn-id: r29552
Diffstat (limited to 'engines/igor/midi.h')
-rw-r--r--engines/igor/midi.h167
1 files changed, 167 insertions, 0 deletions
diff --git a/engines/igor/midi.h b/engines/igor/midi.h
new file mode 100644
index 0000000000..c61ddd9eed
--- /dev/null
+++ b/engines/igor/midi.h
@@ -0,0 +1,167 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef IGOR_MIDI_H
+#define IGOR_MIDI_H
+
+#include "common/util.h"
+#include "common/mutex.h"
+
+#include "sound/fmopl.h"
+#include "sound/mididrv.h"
+#include "sound/midiparser.h"
+#include "sound/softsynth/emumidi.h"
+
+namespace Igor {
+
+enum {
+ kAdlibCarrier = 0,
+ kAdlibModulator
+};
+
+struct AdlibInstrument {
+ uint8 chr[2];
+ uint8 scale[2];
+ uint8 attack[2];
+ uint8 sustain[2];
+ uint8 waveSel[2];
+ uint8 feedback;
+};
+
+class MidiParser_CTMF : public MidiParser {
+public:
+
+ enum {
+ kMaxInstruments = 16
+ };
+
+ MidiParser_CTMF();
+ ~MidiParser_CTMF() {}
+
+ bool loadMusic(byte *data, uint32 size);
+
+ AdlibInstrument _instruments[kMaxInstruments];
+ int _instrumentsCount;
+
+protected:
+
+ void decodeHeader(const uint8 *p);
+ void decodeAdlibInstrument(struct AdlibInstrument *ins, const uint8 *p);
+
+ void parseNextEvent(EventInfo &info);
+
+private:
+
+ int _instrumentsDataOffset;
+ int _midiDataOffset;
+ int _ticksPerQuarter;
+ int _ticksPerSecond;
+ int _basicTempo;
+};
+
+class AdlibMidiDriver : public MidiDriver_Emulated {
+public:
+
+ enum {
+ kAdlibChannelsCount = 18
+ };
+
+ AdlibMidiDriver(Audio::Mixer *mixer) : MidiDriver_Emulated(mixer) {}
+ ~AdlibMidiDriver() {}
+
+ // MidiDriver
+ int open();
+ void close();
+ void send(uint32 b);
+ void metaEvent(byte type, byte *data, uint16 length) {}
+ void sysEx(const byte *msg, uint16 length) {}
+ MidiChannel *allocateChannel() { return 0; }
+ MidiChannel *getPercussionChannel() { return 0; }
+
+ // AudioStream
+ bool isStereo() const { return false; }
+ int getRate() const { return _mixer->getOutputRate(); }
+
+ // MidiDriver_Emulated
+ void generateSamples(int16 *buf, int len);
+
+ void setInstruments(AdlibInstrument *i) { _adlibInstruments = i; }
+
+private:
+
+ void adlibWrite(int port, int value);
+ void adlibSetupCard();
+ void adlibTurnNoteOff(int channel, int note);
+ void adlibTurnNoteOn(int channel, int note, int velocity);
+ void adlibSetupInstrument(int channel, const AdlibInstrument &ins);
+ void adlibSetupPercussion(int channel, const AdlibInstrument &ins);
+ void adlibSetupNote(int channel, int note, int velocity);
+ void adlibEndNote(int channel);
+ void adlibSetVolume(int channel, int volume);
+ void adlibControlChange(int channel, int control, int param);
+ void adlibProgramChange(int channel, int num);
+
+ FM_OPL *_opl;
+ uint8 _adlibData[256];
+ bool _adlibRhythmMode;
+ struct {
+ int ch;
+ int note;
+ int lt;
+ } _adlibChannels[kAdlibChannelsCount];
+ int _adlibInstrumentsMappingTable[kAdlibChannelsCount];
+ AdlibInstrument *_adlibInstruments;
+
+ static const uint8 _adlibOperatorsTable[];
+ static const uint8 _adlibChannelsMappingTable[];
+ static const int16 _adlibNoteFreqTable[];
+ static const uint8 _adlibPercussionsMappingTable[];
+};
+
+class IgorEngine;
+
+class MidiPlayer {
+public:
+
+ MidiPlayer(IgorEngine *vm);
+ ~MidiPlayer();
+
+ void playMusic(uint8 *data, uint32 size);
+ void stopMusic();
+
+private:
+
+ void updateTimer();
+ static void updateTimerCallback(void *p) { ((MidiPlayer *)p)->updateTimer(); }
+
+ MidiParser_CTMF *_parser;
+ AdlibMidiDriver *_driver;
+ Common::Mutex _mutex;
+ bool _isPlaying;
+};
+
+} // namespace Igor
+
+#endif