Skip to content

Commit

Permalink
SOUND: Load XACT SoundBank pitch event parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMcCoy committed Jan 1, 2019
1 parent 424b403 commit e7b79e3
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 2 deletions.
24 changes: 24 additions & 0 deletions src/sound/xactsoundbank.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,30 @@ XACTSoundBank::WaveBank::~WaveBank() {
}


XACTSoundBank::Event::Event(EventType t) : type(t), timestamp(0) {
switch (type) {
case kEventTypePitch:
params.pitch.isRelative = false;
params.pitch.enableFade = false;
params.pitch.enableVariation = false;

params.pitch.fadeStepCount = 0;
params.pitch.fadeDuration = 0;

params.pitch.pitchStart = 0.0f;
params.pitch.pitchEnd = 0.0f;
break;

case kEventTypeLoop:
params.loop.count = 0;
break;

default:
break;
}
}


XACTSoundBank *XACTSoundBank::load(const Common::UString &name) {
try {
Common::ScopedPtr<Common::SeekableReadStream> stream;
Expand Down
14 changes: 13 additions & 1 deletion src/sound/xactsoundbank.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,25 @@ class XACTSoundBank {
uint32 timestamp; ///< Timestamp of the event, in milliseconds.

union {
struct {
bool isRelative; ///< Relative to the current pitch or absolute?
bool enableFade; ///< Fade from pitchStart to pitchEnd.
bool enableVariation; ///< Randomly vary between pitchStart and pitchEnd.

uint16 fadeStepCount; ///< Number of steps during a fade.
uint32 fadeDuration; ///< Number of milliseconds a fade should last.

float pitchStart; ///< Lower bound or starting value in semitones (-24.0f to 24.0f).
float pitchEnd; ///< Upper bound or ending value in semitones (-24.0f to 24.0f).
} pitch;

struct {
uint16 count;
} loop;

} params;

Event(EventType t) : type(t), timestamp(0) { }
Event(EventType t);
};

/** A wave within a sound track. */
Expand Down
17 changes: 17 additions & 0 deletions src/sound/xactsoundbank_ascii.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,23 @@ void XACTSoundBank_ASCII::load(Common::SeekableReadStream &xsb) {
track.events.push_back(Event(kEventTypeVolume));
} else if (tokens[0] == "PITCH") {
track.events.push_back(Event(kEventTypePitch));
Event &event = track.events.back();

if (tokens.size() > 1)
event.params.pitch.enableVariation = tokens[1] == "1";
if (tokens.size() > 2)
event.params.pitch.isRelative = tokens[2] == "1";

if (tokens.size() > 3)
event.params.pitch.fadeStepCount = getNumber(tokens[3]);
if (tokens.size() > 5)
event.params.pitch.fadeDuration = getNumber(tokens[5]);

if (tokens.size() > 6)
event.params.pitch.pitchStart = CLIP(getNumber(tokens[6]) / 100.0f, -24.0f, 24.0f);
if (tokens.size() > 7)
event.params.pitch.pitchEnd = CLIP(getNumber(tokens[7]) / 100.0f, -24.0f, 24.0f);

} else if (tokens[0] == "LPF") {
track.events.push_back(Event(kEventTypeLowPass));
} else if (tokens[0] == "MFLFO") {
Expand Down
29 changes: 28 additions & 1 deletion src/sound/xactsoundbank_binary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ enum PlayEventFlags {
kPlayEventMultipleVariations = 0x04
};

enum PitchEventFlags {
kPitchEventVariation = 0x04,
kPitchEventRelative = 0x10,
kPitchEventFade = 0x20
};

XACTSoundBank_Binary::XACTSoundBank_Binary(Common::SeekableReadStream &xsb) {
load(xsb);
}
Expand Down Expand Up @@ -235,8 +241,29 @@ void XACTSoundBank_Binary::readComplexTrack(Common::SeekableReadStream &xsb, Tra
}
break;

case kEventTypePitch:
event.params.pitch.fadeStepCount = xsb.readUint16LE();

event.params.pitch.isRelative = eventFlags & kPitchEventRelative;
event.params.pitch.enableFade = eventFlags & kPitchEventFade;
event.params.pitch.enableVariation = eventFlags & kPitchEventVariation;

if (parameterSize >= 8) {
event.params.pitch.pitchStart = CLIP((xsb.readSint16LE() * 12) / 4096.0f, -24.0f, 24.0f);
event.params.pitch.pitchEnd = CLIP((xsb.readSint16LE() * 12) / 4096.0f, -24.0f, 24.0f);

xsb.skip(1); // Unknown

event.params.pitch.fadeDuration = xsb.readByte();
event.params.pitch.fadeDuration += xsb.readByte() << 8;
event.params.pitch.fadeDuration += xsb.readByte() << 16;

parameterSize -= 8;
}
break;

case kEventTypeLoop:
track.events.back().params.loop.count = xsb.readUint16LE();
event.params.loop.count = xsb.readUint16LE();
break;

default:
Expand Down

0 comments on commit e7b79e3

Please sign in to comment.