scummvm/sound/mpu401.h
Jamieson Christian c6568530bd Revamped iMuse and Player classes. Player now uses MidiParser to parse its data, which will allow it to parse other MIDI formats. To receive parsed data, Player now derives from MidiDriver to act as a "fake MIDI driver".
Miscellaneous upgrades and fixes to MidiParser, including the Smart Jump (which could not be tested before iMuse started making use of the MidiParser).

*** THIS IS A BIG UPGRADE! EXTENSIVE REGRESSION TESTING IS NEEDED! ***

This has been tested through the intros and a number of other scenes from MI2, FOA and S&M.

NOTE! This upgrade introduces savegame format version V19. Earlier version savegames will load, but the music will simply start over from the beginning. Only V19 and later games will properly restore the position of the music! Don't say you weren't warned....

svn-id: r7849
2003-05-23 04:19:47 +00:00

101 lines
2.9 KiB
C++

/* ScummVM - Scumm Interpreter
* Copyright (C) 2001-2003 The ScummVM project
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header$
*
*/
#ifndef SOUND_MPU401_H
#define SOUND_MPU401_H
#include "mididrv.h"
////////////////////////////////////////
//
// Common MPU401 implementation methods
//
////////////////////////////////////////
typedef void TimerCallback (void *);
class MidiDriver_MPU401;
class MidiChannel_MPU401 : public MidiChannel {
friend class MidiDriver_MPU401;
private:
MidiDriver_MPU401 *_owner;
bool _allocated;
byte _channel;
void init (MidiDriver_MPU401 *owner, byte channel);
void allocate() { _allocated = true; }
public:
MidiDriver *device();
byte getNumber() { return _channel; }
void release() { _allocated = false; }
// Regular messages
void noteOff (byte note);
void noteOn (byte note, byte velocity);
void programChange (byte program);
void pitchBend (int16 bend);
// Control Change messages
void controlChange (byte control, byte value);
void modulationWheel (byte value) { controlChange (1, value); }
void volume (byte value) { controlChange (7, value); }
void panPosition (byte value) { controlChange (10, value); }
void pitchBendFactor (byte value);
void detune (byte value) { controlChange (17, value); }
void priority (byte value) { controlChange (18, value); }
void sustain (bool value) { controlChange (64, value ? 1 : 0); }
void effectLevel (byte value) { controlChange (91, value); }
void chorusLevel (byte value) { controlChange (93, value); }
void allNotesOff() { controlChange (123, 0); }
// SysEx messages
void sysEx_customInstrument (uint32 type, byte *instr);
};
class MidiDriver_MPU401 : public MidiDriver {
private:
MidiChannel_MPU401 _midi_channels [16];
bool _started_thread;
TimerCallback *_timer_proc;
void *_timer_param;
static int midi_driver_thread (void *param);
public:
MidiDriver_MPU401();
void setTimerCallback(void *timer_param, void (*timer_proc) (void *));
uint32 getBaseTempo(void) { return 10000; } // 0x4A0000; } // Now referenced in microseconds between callbacks
virtual void sysEx_customInstrument (byte channel, uint32 type, byte *instr);
MidiChannel *allocateChannel();
MidiChannel *getPercussionChannel() { return &_midi_channels [9]; }
};
#endif