summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2009-08-30 22:03:20 +0000
committerSimon Howard2009-08-30 22:03:20 +0000
commit1d045ed19c58abff063ac69db24a2e73d62ef530 (patch)
tree76ad609889db4afdd0a5332692ce34bf470e99ad
parentca23c95db8053b82fb817241e5de83a881f931e5 (diff)
downloadchocolate-doom-1d045ed19c58abff063ac69db24a2e73d62ef530.tar.gz
chocolate-doom-1d045ed19c58abff063ac69db24a2e73d62ef530.tar.bz2
chocolate-doom-1d045ed19c58abff063ac69db24a2e73d62ef530.zip
Initial, broken, volume level setting.
Subversion-branch: /branches/opl-branch Subversion-revision: 1644
-rw-r--r--src/i_oplmusic.c48
-rw-r--r--src/midifile.h3
2 files changed, 49 insertions, 2 deletions
diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c
index 3d9a2649..7a619c5d 100644
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -160,6 +160,27 @@ static const unsigned int note_frequencies[] = {
0x2da, 0x306, 0x334, 0x365, 0x398, 0x3cf,
};
+// Mapping from MIDI volume level to OPL level value.
+
+static const unsigned int volume_mapping_table[] = {
+ 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x3a,
+ 0x39, 0x38, 0x37, 0x37, 0x36, 0x35, 0x34, 0x34,
+ 0x33, 0x32, 0x32, 0x31, 0x30, 0x2f, 0x2f, 0x2e,
+ 0x2d, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27,
+ 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x22, 0x21,
+ 0x20, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c,
+ 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18, 0x17,
+ 0x17, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x14,
+ 0x14, 0x13, 0x13, 0x12, 0x12, 0x12, 0x11, 0x11,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e,
+ 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b,
+ 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x04,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+};
+
static boolean music_initialised = false;
//static boolean musicpaused = false;
@@ -662,7 +683,10 @@ static void NoteOnEvent(opl_track_data_t *track, midi_event_t *event)
// TODO: Set the volume level.
- WriteRegister(OPL_REGS_LEVEL + voice->op2, 0);
+ WriteRegister(OPL_REGS_LEVEL + voice->op2,
+ volume_mapping_table[channel->volume]);
+
+ printf("volume = %i\n", channel->volume);
// Play the note.
@@ -694,12 +718,32 @@ static void ProgramChangeEvent(opl_track_data_t *track, midi_event_t *event)
static void ControllerEvent(opl_track_data_t *track, midi_event_t *event)
{
+ unsigned int controller;
+ unsigned int param;
+ opl_channel_data_t *channel;
+
printf("change controller: channel %i, %i, %i\n",
event->data.channel.channel,
event->data.channel.param1,
event->data.channel.param2);
- // TODO: Volume, pan.
+ channel = &track->channels[event->data.channel.channel];
+ controller = event->data.channel.param1;
+ param = event->data.channel.param2;
+
+ switch (controller)
+ {
+ case MIDI_CONTROLLER_MAIN_VOLUME:
+ channel->volume = param;
+ break;
+
+ case MIDI_CONTROLLER_PAN:
+ break;
+
+ default:
+ fprintf(stderr, "Unknown MIDI controller type: %i\n", controller);
+ break;
+ }
}
// Process a MIDI event from a track.
diff --git a/src/midifile.h b/src/midifile.h
index a1ab4976..faef549c 100644
--- a/src/midifile.h
+++ b/src/midifile.h
@@ -54,6 +54,9 @@ typedef enum
MIDI_CONTROLLER_FOOT_CONTROL = 0x3,
MIDI_CONTROLLER_PORTAMENTO = 0x4,
MIDI_CONTROLLER_DATA_ENTRY = 0x5,
+
+ MIDI_CONTROLLER_MAIN_VOLUME = 0x7,
+ MIDI_CONTROLLER_PAN = 0xa
} midi_controller_t;
typedef enum