mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-20 16:59:06 +00:00
137 lines
3.8 KiB
C++
137 lines
3.8 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef SCI_MIDIPARSER_H
|
|
#define SCI_MIDIPARSER_H
|
|
|
|
#include "sci/resource.h"
|
|
#include "sci/sound/music.h"
|
|
#include "audio/midiparser.h"
|
|
|
|
/*
|
|
Sound drivers info: (from driver cmd0)
|
|
AdLib/SB : track 0 , voices 9 , patch 3 ah=1
|
|
ProAudioSp: track 0 , voices 9 , patch 3 ah=17
|
|
GenerlMIDI: track 7 , voices 32, patch 4 ah=1 SCI1.1
|
|
Game Blast: track 9 , voices 12, patch 101 ah=1
|
|
MT-32 : track 12, voices 32, patch 1 ah=1
|
|
PC Speaker: track 18, voices 1 , patch 0xFF ah=1
|
|
Tandy : track 19, voices 3 , patch 101 ah=1
|
|
IBM PS/1 : track 19, voices 3 , patch 101 ah=1
|
|
|
|
*/
|
|
|
|
namespace Sci {
|
|
|
|
/**
|
|
* An extended standard MIDI (SMF) parser. Sierra used an extra channel
|
|
* with special commands for extended functionality and animation syncing.
|
|
* Refer to MidiParser_SMF() in /sound/midiparser_smf.cpp for the standard
|
|
* MIDI (SMF) parser functionality that the SCI MIDI parser is based on
|
|
*/
|
|
class MidiParser_SCI : public MidiParser {
|
|
public:
|
|
MidiParser_SCI(SciVersion soundVersion, SciMusic *music);
|
|
~MidiParser_SCI();
|
|
|
|
void mainThreadBegin();
|
|
void mainThreadEnd();
|
|
|
|
bool loadMusic(SoundResource::Track *track, MusicEntry *psnd, int channelFilterMask, SciVersion soundVersion);
|
|
bool loadMusic(byte *, uint32) {
|
|
return false;
|
|
}
|
|
void sendInitCommands();
|
|
void unloadMusic();
|
|
void setMasterVolume(byte masterVolume);
|
|
void setVolume(byte volume);
|
|
void stop() {
|
|
_abortParse = true;
|
|
allNotesOff();
|
|
}
|
|
void pause() {
|
|
allNotesOff();
|
|
if (_resetOnPause)
|
|
jumpToTick(0);
|
|
}
|
|
|
|
void allNotesOff();
|
|
|
|
const byte *getMixedData() const { return _mixedData; }
|
|
byte getSongReverb();
|
|
|
|
void sendFromScriptToDriver(uint32 midi);
|
|
void sendToDriver(uint32 midi);
|
|
void sendToDriver(byte status, byte firstOp, byte secondOp) {
|
|
sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16));
|
|
}
|
|
|
|
void remapChannel(int channel, int devChannel);
|
|
|
|
protected:
|
|
void parseNextEvent(EventInfo &info);
|
|
bool processEvent(const EventInfo &info, bool fireEvents = true);
|
|
byte *midiMixChannels();
|
|
byte *midiFilterChannels(int channelMask);
|
|
byte midiGetNextChannel(long ticker);
|
|
void resetStateTracking();
|
|
void trackState(uint32 midi);
|
|
void sendToDriver_raw(uint32 midi);
|
|
|
|
SciMusic *_music;
|
|
|
|
// this is set, when main thread calls us -> we send commands to queue instead to driver
|
|
bool _mainThreadCalled;
|
|
|
|
SciVersion _soundVersion;
|
|
byte *_mixedData;
|
|
SoundResource::Track *_track;
|
|
MusicEntry *_pSnd;
|
|
uint32 _loopTick;
|
|
byte _masterVolume; // the overall master volume (same for all tracks)
|
|
byte _volume; // the global volume of the current track
|
|
|
|
bool _resetOnPause;
|
|
|
|
bool _channelUsed[16];
|
|
int16 _channelRemap[16];
|
|
bool _channelMuted[16];
|
|
byte _channelVolume[16];
|
|
|
|
struct ChannelState {
|
|
int8 _modWheel;
|
|
int8 _pan;
|
|
int8 _patch;
|
|
int8 _note;
|
|
bool _sustain;
|
|
int16 _pitchWheel;
|
|
int8 _voices;
|
|
};
|
|
|
|
ChannelState _channelState[16];
|
|
|
|
};
|
|
|
|
} // End of namespace Sci
|
|
|
|
#endif
|