aboutsummaryrefslogtreecommitdiff
path: root/audio/softsynth
diff options
context:
space:
mode:
Diffstat (limited to 'audio/softsynth')
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_euphony.cpp34
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_euphony.h16
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_midi.cpp86
-rw-r--r--audio/softsynth/fmtowns_pc98/towns_midi.h7
4 files changed, 75 insertions, 68 deletions
diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.cpp b/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
index 49c156f142..cb6cfc53f3 100644
--- a/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_euphony.cpp
@@ -27,7 +27,7 @@
TownsEuphonyDriver::TownsEuphonyDriver(Audio::Mixer *mixer) : _activeChannels(0), _sustainChannels(0),
_assignedChannels(0), _paraCount(0), _command(0), _tEnable(0), _tMode(0), _tOrdr(0), _tLevel(0),
- _tTranspose(0), _musicPos(0), _musicStart(0), _playing(false), _eventBuffer(0), _bufferedEventsCount(0),
+ _tDetune(0), _musicPos(0), _musicStart(0), _playing(false), _eventBuffer(0), _bufferedEventsCount(0),
_tempoControlMode(0) {
_para[0] = _para[1] = 0;
_intf = new TownsAudioInterface(mixer, this);
@@ -44,7 +44,7 @@ TownsEuphonyDriver::~TownsEuphonyDriver() {
delete[] _tMode;
delete[] _tOrdr;
delete[] _tLevel;
- delete[] _tTranspose;
+ delete[] _tDetune;
}
bool TownsEuphonyDriver::init() {
@@ -59,7 +59,7 @@ bool TownsEuphonyDriver::init() {
delete[] _tMode;
delete[] _tOrdr;
delete[] _tLevel;
- delete[] _tTranspose;
+ delete[] _tDetune;
_activeChannels = new int8[16];
_sustainChannels = new int8[16];
@@ -70,7 +70,7 @@ bool TownsEuphonyDriver::init() {
_tMode = new uint8[32];
_tOrdr = new uint8[32];
_tLevel = new int8[32];
- _tTranspose = new int8[32];
+ _tDetune = new int8[32];
reset();
@@ -220,21 +220,21 @@ void TownsEuphonyDriver::setOutputVolume(int mode, int volLeft, int volRight) {
_intf->callback(67, mode, volLeft, volRight);
}
-int TownsEuphonyDriver::chanEnable(int tableEntry, int val) {
+int TownsEuphonyDriver::configChan_enable(int tableEntry, int val) {
if (tableEntry > 31)
return 3;
_tEnable[tableEntry] = val;
return 0;
}
-int TownsEuphonyDriver::chanMode(int tableEntry, int val) {
+int TownsEuphonyDriver::configChan_setMode(int tableEntry, int val) {
if (tableEntry > 31)
return 3;
_tMode[tableEntry] = val;
return 0;
}
-int TownsEuphonyDriver::chanOrdr(int tableEntry, int val) {
+int TownsEuphonyDriver::configChan_remap(int tableEntry, int val) {
if (tableEntry > 31)
return 3;
if (val < 16)
@@ -242,7 +242,7 @@ int TownsEuphonyDriver::chanOrdr(int tableEntry, int val) {
return 0;
}
-int TownsEuphonyDriver::chanVolumeShift(int tableEntry, int val) {
+int TownsEuphonyDriver::configChan_adjustVolume(int tableEntry, int val) {
if (tableEntry > 31)
return 3;
if (val <= 40)
@@ -250,11 +250,11 @@ int TownsEuphonyDriver::chanVolumeShift(int tableEntry, int val) {
return 0;
}
-int TownsEuphonyDriver::chanNoteShift(int tableEntry, int val) {
+int TownsEuphonyDriver::configChan_setDetune(int tableEntry, int val) {
if (tableEntry > 31)
return 3;
if (val <= 40)
- _tTranspose[tableEntry] = (int8)(val & 0xff);
+ _tDetune[tableEntry] = (int8)(val & 0xff);
return 0;
}
@@ -325,7 +325,7 @@ void TownsEuphonyDriver::resetTables() {
for (int i = 0; i < 32; i++)
_tOrdr[i] = i & 0x0f;
memset(_tLevel, 0, 32);
- memset(_tTranspose, 0, 32);
+ memset(_tDetune, 0, 32);
}
void TownsEuphonyDriver::resetTempo() {
@@ -672,8 +672,8 @@ bool TownsEuphonyDriver::evtSetupNote() {
uint8 velo = _musicPos[5];
sendEvent(mode, evt);
- sendEvent(mode, applyNoteShift(note));
- sendEvent(mode, applyVolumeShift(velo));
+ sendEvent(mode, applyDetune(note));
+ sendEvent(mode, applyVolumeAdjust(velo));
jumpNextLoop();
if (_musicPos[0] == 0xfe || _musicPos[0] == 0xfd)
@@ -712,7 +712,7 @@ bool TownsEuphonyDriver::evtPolyphonicAftertouch() {
uint8 mode = _tMode[_musicPos[1]];
sendEvent(mode, evt);
- sendEvent(mode, applyNoteShift(_musicPos[4]));
+ sendEvent(mode, applyDetune(_musicPos[4]));
sendEvent(mode, _musicPos[5]);
return false;
@@ -780,8 +780,8 @@ bool TownsEuphonyDriver::evtModeOrdrChange() {
return false;
}
-uint8 TownsEuphonyDriver::applyNoteShift(uint8 in) {
- int out = _tTranspose[_musicPos[1]];
+uint8 TownsEuphonyDriver::applyDetune(uint8 in) {
+ int out = _tDetune[_musicPos[1]];
if (!out)
return in;
out += (in & 0x7f);
@@ -795,7 +795,7 @@ uint8 TownsEuphonyDriver::applyNoteShift(uint8 in) {
return out & 0xff;
}
-uint8 TownsEuphonyDriver::applyVolumeShift(uint8 in) {
+uint8 TownsEuphonyDriver::applyVolumeAdjust(uint8 in) {
int out = _tLevel[_musicPos[1]];
out += (in & 0x7f);
out = CLIP(out, 1, 127);
diff --git a/audio/softsynth/fmtowns_pc98/towns_euphony.h b/audio/softsynth/fmtowns_pc98/towns_euphony.h
index a8f22f593a..ae36d1232b 100644
--- a/audio/softsynth/fmtowns_pc98/towns_euphony.h
+++ b/audio/softsynth/fmtowns_pc98/towns_euphony.h
@@ -55,11 +55,11 @@ public:
void setOutputVolume(int chanType, int volLeft, int volRight);
- int chanEnable(int tableEntry, int val);
- int chanMode(int tableEntry, int val);
- int chanOrdr(int tableEntry, int val);
- int chanVolumeShift(int tableEntry, int val);
- int chanNoteShift(int tableEntry, int val);
+ int configChan_enable(int tableEntry, int val);
+ int configChan_setMode(int tableEntry, int val);
+ int configChan_remap(int tableEntry, int val);
+ int configChan_adjustVolume(int tableEntry, int val);
+ int configChan_setDetune(int tableEntry, int val);
int assignChannel(int chan, int tableEntry);
@@ -111,8 +111,8 @@ private:
return false;
}
- uint8 applyNoteShift(uint8 in);
- uint8 applyVolumeShift(uint8 in);
+ uint8 applyDetune(uint8 in);
+ uint8 applyVolumeAdjust(uint8 in);
void sendNoteOff();
void sendNoteOn();
@@ -136,7 +136,7 @@ private:
uint8 *_tMode;
uint8 *_tOrdr;
int8 *_tLevel;
- int8 *_tTranspose;
+ int8 *_tDetune;
struct DlEvent {
uint8 evt;
diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.cpp b/audio/softsynth/fmtowns_pc98/towns_midi.cpp
index 5b2dc7b48f..c492a97122 100644
--- a/audio/softsynth/fmtowns_pc98/towns_midi.cpp
+++ b/audio/softsynth/fmtowns_pc98/towns_midi.cpp
@@ -25,38 +25,6 @@
#include "audio/softsynth/fmtowns_pc98/towns_midi.h"
#include "common/textconsole.h"
-struct ChanState {
- uint8 get(uint8 type) {
- switch (type) {
- case 0:
- return unk1;
- case 1:
- return mulAmsFms;
- case 2:
- return tl;
- case 3:
- return attDec;
- case 4:
- return sus;
- case 5:
- return fgAlg;
- case 6:
- return unk2;
- default:
- break;
- }
- return 0;
- }
-
- uint8 unk1;
- uint8 mulAmsFms;
- uint8 tl;
- uint8 attDec;
- uint8 sus;
- uint8 fgAlg;
- uint8 unk2;
-};
-
class TownsMidiOutputChannel {
friend class TownsMidiInputChannel;
public:
@@ -119,7 +87,7 @@ private:
void keyOn();
void keyOff();
- void internKeySetFreq(uint16 frq);
+ void keyOnSetFreq(uint16 frq);
void out(uint8 reg, uint8 val);
TownsMidiInputChannel *_midi;
@@ -205,6 +173,47 @@ private:
static const uint8 _programAdjustLevel[];
};
+class TownsMidiChanState {
+public:
+ TownsMidiChanState();
+ ~TownsMidiChanState() {}
+ uint8 get(uint8 type);
+
+ uint8 unk1;
+ uint8 mulAmsFms;
+ uint8 tl;
+ uint8 attDec;
+ uint8 sus;
+ uint8 fgAlg;
+ uint8 unk2;
+};
+
+TownsMidiChanState::TownsMidiChanState() {
+ unk1 = mulAmsFms = tl = attDec = sus = fgAlg = unk2 = 0;
+}
+
+uint8 TownsMidiChanState::get(uint8 type) {
+ switch (type) {
+ case 0:
+ return unk1;
+ case 1:
+ return mulAmsFms;
+ case 2:
+ return tl;
+ case 3:
+ return attDec;
+ case 4:
+ return sus;
+ case 5:
+ return fgAlg;
+ case 6:
+ return unk2;
+ default:
+ break;
+ }
+ return 0;
+}
+
TownsMidiOutputChannel::TownsMidiOutputChannel(MidiDriver_TOWNS *driver, int chanIndex) : _driver(driver), _chan(chanIndex),
_midi(0), _prev(0), _next(0), _fld_c(0), _carrierTl(0), _note(0), _modulatorTl(0), _sustainNoteOff(0), _duration(0), _fld_13(0), _prg(0), _freq(0), _freqAdjust(0) {
_stateA = new StateA[2];
@@ -221,12 +230,12 @@ TownsMidiOutputChannel::~TownsMidiOutputChannel() {
void TownsMidiOutputChannel::noteOn(uint8 msb, uint16 lsb) {
_freq = (msb << 7) + lsb;
_freqAdjust = 0;
- internKeySetFreq(_freq);
+ keyOnSetFreq(_freq);
}
void TownsMidiOutputChannel::noteOnPitchBend(uint8 msb, uint16 lsb) {
_freq = (msb << 7) + lsb;
- internKeySetFreq(_freq + _freqAdjust);
+ keyOnSetFreq(_freq + _freqAdjust);
}
void TownsMidiOutputChannel::setupProgram(const uint8 *data, uint8 vol1, uint8 vol2) {
@@ -401,7 +410,7 @@ void TownsMidiOutputChannel::keyOff() {
out(0x28, 0);
}
-void TownsMidiOutputChannel::internKeySetFreq(uint16 frq) {
+void TownsMidiOutputChannel::keyOnSetFreq(uint16 frq) {
uint8 t = (frq << 1) >> 8;
frq = (_freqMSB[t] << 11) | _freqLSB[t] ;
out(0xa4, frq >> 8);
@@ -556,7 +565,7 @@ void TownsMidiInputChannel::noteOn(byte note, byte velocity) {
}
void TownsMidiInputChannel::programChange(byte program) {
- // Dysfunctional since this is all done inside the imuse code
+ // Dysfunctional since this is all done inside the imuse code
}
void TownsMidiInputChannel::pitchBend(int16 bend) {
@@ -663,8 +672,7 @@ MidiDriver_TOWNS::MidiDriver_TOWNS(Audio::Mixer *mixer) : _timerBproc(0), _timer
for (int i = 0; i < 6; i++)
_out[i] = new TownsMidiOutputChannel(this, i);
- _chanState = new ChanState[32];
- memset(_chanState, 0, 32 * sizeof(ChanState));
+ _chanState = new TownsMidiChanState[32];
_chanOutputLevel = new uint8[2048];
for (int i = 0; i < 64; i++) {
diff --git a/audio/softsynth/fmtowns_pc98/towns_midi.h b/audio/softsynth/fmtowns_pc98/towns_midi.h
index 8cffdd71da..005c77cedf 100644
--- a/audio/softsynth/fmtowns_pc98/towns_midi.h
+++ b/audio/softsynth/fmtowns_pc98/towns_midi.h
@@ -31,7 +31,7 @@
class TownsMidiOutputChannel;
class TownsMidiInputChannel;
-struct ChanState;
+class TownsMidiChanState;
class MidiDriver_TOWNS : public MidiDriver, public TownsAudioInterfacePluginDriver {
friend class TownsMidiInputChannel;
@@ -61,9 +61,8 @@ private:
TownsMidiOutputChannel *allocateOutputChannel(int pri);
TownsMidiInputChannel **_channels;
- TownsMidiOutputChannel **_out;
-
- ChanState *_chanState;
+ TownsMidiOutputChannel **_out;
+ TownsMidiChanState *_chanState;
Common::TimerManager::TimerProc _timerBproc;
void *_timerBpara;