Cleanup, mostly related to matching up semantics

between Part and MidiChannel (which Part may
derive from eventually).

svn-id: r10480
This commit is contained in:
Jamieson Christian 2003-09-29 08:09:38 +00:00
parent 1f42fb3a6f
commit 70e8d2780d
3 changed files with 91 additions and 161 deletions

View File

@ -66,7 +66,6 @@ _snm_trigger_index(0)
memset(_channel_volume,0,sizeof(_channel_volume));
memset(_channel_volume_eff,0,sizeof(_channel_volume_eff));
memset(_volchan_table,0,sizeof(_volchan_table));
memset(_active_notes,0,sizeof(_active_notes));
}
byte *IMuseInternal::findStartOfSound(int sound) {
@ -865,7 +864,7 @@ int32 IMuseInternal::doCommand (int numargs, int a[]) {
case 21:
return -1;
case 22:
((Part *)player)->setVolume(a[3]);
((Part *)player)->volume(a[3]);
return 0;
case 23:
return query_queue(a[1]);
@ -1425,7 +1424,7 @@ void Part::set_detune(int8 detune) {
}
}
void Part::set_pitchbend(int value) {
void Part::pitchBend(int16 value) {
_pitchbend = value;
if (_mc) {
_mc->pitchBend(clamp(_pitchbend +
@ -1434,8 +1433,8 @@ void Part::set_pitchbend(int value) {
}
}
void Part::setVolume(uint8 vol) {
_vol_eff = ((_vol = vol) + 1) * _player->getEffectiveVolume() >> 7;
void Part::volume (byte value) {
_vol_eff = ((_vol = value) + 1) * _player->getEffectiveVolume() >> 7;
if (_mc)
_mc->volume(_vol_eff);
}
@ -1461,47 +1460,47 @@ void Part::set_transpose(int8 transpose) {
}
}
void Part::set_pedal(bool value) {
void Part::sustain(bool value) {
_pedal = value;
if (_mc)
_mc->sustain(_pedal);
_mc->sustain(value);
}
void Part::set_modwheel(uint value) {
void Part::modulationWheel(byte value) {
_modwheel = value;
if (_mc)
_mc->modulationWheel(_modwheel);
_mc->modulationWheel(value);
}
void Part::set_chorus(uint chorus) {
_chorus = chorus;
void Part::chorusLevel(byte value) {
_chorus = value;
if (_mc)
_mc->chorusLevel(_effect_level);
_mc->chorusLevel(value);
}
void Part::set_effect_level(uint level)
void Part::effectLevel(byte value)
{
_effect_level = level;
_effect_level = value;
if (_mc)
_mc->effectLevel(_effect_level);
_mc->effectLevel(value);
}
void Part::fix_after_load() {
set_transpose(_transpose);
setVolume(_vol);
volume(_vol);
set_detune(_detune);
set_pri(_pri);
set_pan(_pan);
sendAll();
}
void Part::set_pitchbend_factor(uint8 value) {
void Part::pitchBendFactor(byte value) {
if (value > 12)
return;
set_pitchbend(0);
pitchBend(0);
_pitchbend_factor = value;
if (_mc)
_mc->pitchBendFactor(_pitchbend_factor);
_mc->pitchBendFactor(value);
}
void Part::set_onoff(bool on) {
@ -1526,9 +1525,11 @@ void Part::load_global_instrument(byte slot) {
_instrument.send(_mc);
}
void Part::key_on(byte note, byte velocity) {
void Part::noteOn(byte note, byte velocity) {
if (!_on)
return;
MidiChannel *mc = _mc;
_actives[note >> 4] |= (1 <<(note & 0xF));
// DEBUG
if (_unassigned_instrument && !_percussion) {
@ -1551,9 +1552,11 @@ void Part::key_on(byte note, byte velocity) {
}
}
void Part::key_off(byte note) {
void Part::noteOff(byte note) {
if (!_on)
return;
MidiChannel *mc = _mc;
_actives[note >> 4] &= ~(1 <<(note & 0xF));
if (mc) {
mc->noteOff(note);
} else if (_percussion) {
@ -1568,7 +1571,6 @@ void Part::init() {
_next = NULL;
_prev = NULL;
_mc = NULL;
memset(_actives, 0, sizeof(_actives));
}
void Part::setup(Player *player) {
@ -1611,7 +1613,6 @@ void Part::off() {
_mc->release();
_mc = NULL;
}
memset(_actives, 0, sizeof(_actives));
}
bool Part::clearToTransmit() {
@ -1637,33 +1638,9 @@ void Part::sendAll() {
_mc->priority(_pri_eff);
}
int Part::update_actives(uint16 *active) {
int i, j;
uint16 *act, mask, bits;
int count = 0;
bits = 1 << _chan;
act = _actives;
for (i = 8; i; i--) {
mask = *act++;
if (mask) {
for (j = 16; j; j--, mask >>= 1, active++) {
if (mask & 1 && !(*active & bits)) {
*active |= bits;
count++;
}
}
} else {
active += 16;
}
}
return count;
}
void Part::set_program(byte program) {
void Part::programChange(byte value) {
_bank = 0;
_instrument.program(program, _player->isMT32());
_instrument.program(value, _player->isMT32());
if (clearToTransmit())
_instrument.send(_mc);
}
@ -1677,11 +1654,10 @@ void Part::set_instrument(uint b) {
_instrument.send(_mc);
}
void Part::silence() {
void Part::allNotesOff() {
if (!_mc)
return;
_mc->allNotesOff();
memset(_actives, 0, sizeof(_actives));
}
////////////////////////////////////////

View File

@ -147,6 +147,11 @@ struct CommandQueue {
};
class Player : public MidiDriver {
protected:
// Moved from IMuseInternal.
// This is only used by one player at a time.
static uint16 _active_notes[128];
protected:
MidiDriver *_midi;
MidiParser *_parser;
@ -188,8 +193,6 @@ protected:
void hook_clear();
void uninit_parts();
byte *parse_midi(byte *s);
void key_off(uint8 chan, byte data);
void key_on(uint8 chan, byte data, byte velocity);
void part_set_transpose(uint8 chan, byte relative, int8 b);
void parse_sysex(byte *p, uint len);
void maybe_jump(byte cmd, uint track, uint beat, uint tick);
@ -198,7 +201,6 @@ protected:
void maybe_set_volume(byte *data);
void maybe_set_program(byte *data);
void maybe_set_transpose_part(byte *data);
uint update_actives();
void turn_off_pedals();
int query_part_param(int param, byte chan);
void turn_off_parts();
@ -208,10 +210,6 @@ protected:
static void decode_sysex_bytes(const byte *src, byte *dst, int len);
void clear_active_note(int chan, byte note);
void set_active_note(int chan, byte note);
void clear_active_notes();
// Sequencer part
int start_seq_sound(int sound, bool reset_vars = true);
int query_param(int param);
@ -301,36 +299,35 @@ struct Part {
Instrument _instrument;
bool _unassigned_instrument; // For diagnostic reporting purposes only
// Used to be in MidiDriver
uint16 _actives[8];
// MidiChannel interface
// (We don't currently derive from MidiChannel,
// but if we ever do, this will make it easy.)
void noteOff(byte note);
void noteOn(byte note, byte velocity);
void programChange(byte value);
void pitchBend(int16 value);
void modulationWheel(byte value);
void volume(byte value);
void pitchBendFactor(byte value);
void sustain(bool value);
void effectLevel(byte value);
void chorusLevel(byte value);
void allNotesOff();
void key_on(byte note, byte velocity);
void key_off(byte note);
void set_param(byte param, int value) { }
void init();
void setup(Player *player);
void uninit();
void off();
void silence();
void set_instrument(uint b);
void set_instrument(byte *data);
void load_global_instrument(byte b);
void set_transpose(int8 transpose);
void setVolume(uint8 volume);
void set_detune(int8 detune);
void set_pri(int8 pri);
void set_pan(int8 pan);
void set_modwheel(uint value);
void set_pedal(bool value);
void set_pitchbend(int value);
void release_pedal();
void set_program(byte program);
void set_chorus(uint chorus);
void set_effect_level(uint level);
int update_actives(uint16 *active);
void set_pitchbend_factor(uint8 value);
void set_onoff(bool on);
void fix_after_load();
@ -386,7 +383,6 @@ protected:
Player _players[8];
Part _parts[32];
uint16 _active_notes[128];
Instrument _global_adlib_instruments[32];
CommandQueue _cmd_queue[64];
DeferredCommand _deferredCommands[4];

View File

@ -34,16 +34,14 @@
////////////////////////////////////////
//
// Helper functions
// Miscellaneous
//
////////////////////////////////////////
extern MidiParser *MidiParser_createRO();
extern MidiParser *MidiParser_createEUP();
static uint read_word(byte *a) {
return (a[0] << 8) + a[1];
}
uint16 Player::_active_notes[128];
@ -233,17 +231,21 @@ void Player::send(uint32 b) {
switch (cmd >> 4) {
case 0x8: // Key Off
if (!_scanning)
key_off(chan, param1);
else
clear_active_note(chan, param1);
if (!_scanning) {
if ((part = getPart(chan)) != 0)
part->noteOff(param1);
} else {
_active_notes[param1] &= ~(1 << chan);
}
break;
case 0x9: // Key On
if (!_scanning)
key_on(chan, param1, param2);
else
set_active_note(chan, param1);
if (!_scanning) {
if ((part = getPart(chan)) != 0)
part->noteOn(param1, param2);
} else {
_active_notes[param1] |= (1 << chan);
}
break;
case 0xB: // Control Change
@ -253,16 +255,16 @@ void Player::send(uint32 b) {
switch (param1) {
case 1: // Modulation Wheel
part->set_modwheel(param2);
part->modulationWheel(param2);
break;
case 7: // Volume
part->setVolume(param2);
part->volume(param2);
break;
case 10: // Pan Position
part->set_pan(param2 - 0x40);
break;
case 16: // Pitchbend Factor(non-standard)
part->set_pitchbend_factor(param2);
part->pitchBendFactor(param2);
break;
case 17: // GP Slider 2
part->set_detune(param2 - 0x40);
@ -272,16 +274,16 @@ void Player::send(uint32 b) {
_se->reallocateMidiChannels(_midi);
break;
case 64: // Sustain Pedal
part->set_pedal(param2 != 0);
part->sustain(param2 != 0);
break;
case 91: // Effects Level
part->set_effect_level(param2);
part->effectLevel(param2);
break;
case 93: // Chorus Level
part->set_chorus(param2);
part->chorusLevel(param2);
break;
case 123: // All Notes Off
part->silence();
part->allNotesOff();
break;
default:
warning("Player::send(): Invalid control change %d", param1);
@ -293,7 +295,7 @@ void Player::send(uint32 b) {
if (part) {
if (_isGM) {
if (param1 < 128)
part->set_program(param1);
part->programChange(param1);
} else {
if (param1 < 32)
part->load_global_instrument(param1);
@ -304,7 +306,7 @@ void Player::send(uint32 b) {
case 0xE: // Pitch Bend
part = getPart(chan);
if (part)
part->set_pitchbend(((param2 << 7) | param1) - 0x2000);
part->pitchBend(((param2 << 7) | param1) - 0x2000);
break;
case 0xA: // Aftertouch
@ -384,7 +386,7 @@ void Player::sysEx(byte *p, uint16 len) {
if (part) {
part->set_onoff(p[2] & 0x01);
part->set_pri (p[4]);
part->setVolume((p[5] & 0x0F) << 4 |(p[6] & 0x0F));
part->volume((p[5] & 0x0F) << 4 |(p[6] & 0x0F));
part->_percussion = _isGM ?((p[9] & 0x08) > 0) : false;
if (part->_percussion) {
if (part->_mc) {
@ -424,7 +426,7 @@ void Player::sysEx(byte *p, uint16 len) {
// This SysEx is used in Sam & Max for maybe_jump.
if (_scanning)
break;
maybe_jump(p[0], p[1] - 1, (read_word(p + 2) - 1) * 4 + p[4], ((p[5] * TICKS_PER_BEAT) >> 2) + p[6]);
maybe_jump(p[0], p[1] - 1, (READ_BE_UINT16(p + 2) - 1) * 4 + p[4], ((p[5] * TICKS_PER_BEAT) >> 2) + p[6]);
break;
case 2: // Start of song. Ignore for now.
@ -440,7 +442,7 @@ void Player::sysEx(byte *p, uint16 len) {
part->set_instrument((byte *) buf);
} else {
// SPK tracks have len == 49 here, and are not supported
part->set_program(254); // Must be invalid, but not 255(which is reserved)
part->programChange(254); // Must be invalid, but not 255(which is reserved)
}
}
break;
@ -458,14 +460,14 @@ void Player::sysEx(byte *p, uint16 len) {
decode_sysex_bytes(p, buf, len - 3);
part = getPart(a);
if (part)
part->set_param(read_word(buf), read_word(buf + 2));
part->set_param(READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2));
break;
case 48: // Hook - jump
if (_scanning)
break;
decode_sysex_bytes(p + 1, buf, len - 2);
maybe_jump(buf[0], read_word(buf + 1), read_word(buf + 3), read_word(buf + 5));
maybe_jump(buf[0], READ_BE_UINT16(buf + 1), READ_BE_UINT16(buf + 3), READ_BE_UINT16(buf + 5));
break;
case 49: // Hook - global transpose
@ -507,9 +509,9 @@ void Player::sysEx(byte *p, uint16 len) {
case 80: // Loop
decode_sysex_bytes(p + 1, buf, len - 2);
setLoop(read_word(buf),
read_word(buf + 2), read_word(buf + 4), read_word(buf + 6), read_word(buf + 8)
);
setLoop(READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2),
READ_BE_UINT16(buf + 4), READ_BE_UINT16(buf + 6),
READ_BE_UINT16(buf + 8));
break;
case 81: // End loop
@ -609,7 +611,7 @@ void Player::maybe_set_volume(byte *data) {
part = getPart(chan);
if (part)
part->setVolume(data[2]);
part->volume(data[2]);
}
void Player::maybe_set_program(byte *data) {
@ -632,7 +634,7 @@ void Player::maybe_set_program(byte *data) {
part = getPart(chan);
if (part)
part->set_program(data[2]);
part->programChange(data[2]);
}
void Player::maybe_set_transpose_part(byte *data) {
@ -673,18 +675,6 @@ int Player::setTranspose(byte relative, int b) {
return 0;
}
void Player::clear_active_notes() {
memset(_se->_active_notes, 0, sizeof(_se->_active_notes));
}
void Player::clear_active_note(int chan, byte note) {
_se->_active_notes[note] &= ~(1 << chan);
}
void Player::set_active_note(int chan, byte note) {
_se->_active_notes[note] |= (1 << chan);
}
void Player::part_set_transpose(uint8 chan, byte relative, int8 b) {
Part *part;
@ -699,25 +689,6 @@ void Player::part_set_transpose(uint8 chan, byte relative, int8 b) {
part->set_transpose(b);
}
void Player::key_on(uint8 chan, byte note, uint8 velocity) {
Part *part;
part = getPart(chan);
if (!part || !part->_on)
return;
part->key_on(note, velocity);
}
void Player::key_off(uint8 chan, byte note) {
Part *part;
for (part = _parts; part; part = part->_next) {
if (part->_chan == (byte)chan && part->_on)
part->key_off(note);
}
}
bool Player::jump(uint track, uint beat, uint tick) {
if (!_parser)
return false;
@ -755,7 +726,7 @@ void Player::turn_off_pedals() {
for (part = _parts; part; part = part->_next) {
if (part->_pedal)
part->set_pedal(false);
part->sustain(false);
}
}
@ -794,20 +765,6 @@ Part *Player::getPart(uint8 chan) {
return part;
}
uint Player::update_actives() {
Part *part;
uint16 *active;
int count = 0;
clear_active_notes();
active = _se->_active_notes;
for (part = _parts; part; part = part->_next) {
if (part->_mc)
count += part->update_actives(active);
}
return count;
}
void Player::setPriority(int pri) {
Part *part;
@ -844,7 +801,7 @@ int Player::scan(uint totrack, uint tobeat, uint totick) {
tobeat++;
turn_off_parts();
clear_active_notes();
memset(_active_notes, 0, sizeof(_active_notes));
_scanning = true;
// If the scan involves a track switch, scan to the end of
@ -880,13 +837,14 @@ void Player::turn_off_parts() {
void Player::play_active_notes() {
int i, j;
uint mask;
Part *part;
for (i = 0; i != 128; i++) {
mask = _se->_active_notes[i];
for (j = 0; j != 16; j++, mask >>= 1) {
if (mask & 1) {
key_on(j, i, 80);
}
for (i = 0; i < 16; ++i) {
part = getPart (i);
mask = 1 << i;
for (j = 0; j < 128; ++j) {
if (_active_notes[j] & mask)
part->noteOn (j, 80);
}
}
}
@ -901,7 +859,7 @@ int Player::setVolume(byte vol) {
_vol_eff = _se->get_channel_volume(_vol_chan) *(vol + 1) >> 7;
for (part = _parts; part; part = part->_next) {
part->setVolume(part->_vol);
part->volume(part->_vol);
}
return 0;