ref: 13314576f8d5d8eec8bf413ca4b49255b9e1a6a2
parent: 47282d2ca9ae99fb7bfa27408158df0544ac11b3
author: Simon Howard <[email protected]>
date: Sat Sep 19 16:42:45 EDT 2009
Add octave offset table, offset notes on specific instruments down by one octave, as per research. Subversion-branch: /branches/opl-branch Subversion-revision: 1678
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -304,6 +304,31 @@
124, 124, 125, 125, 126, 126, 127, 127
};
+// For octave offset table:
+
+static const unsigned int octave_offset_table[2][128] = {
+ {
+ 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, // 0-15
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, // 32-47
+ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 48-63
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, // 64-79
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, // 80-95
+ 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // 96-111
+ 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, // 112-127
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 32-47
+ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 48-63
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64-79
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80-95
+ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96-111
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112-127
+ }
+};
+
static boolean music_initialised = false;
//static boolean musicpaused = false;
@@ -832,10 +857,12 @@
unsigned int key;
unsigned int i;
+/*
printf("note off: channel %i, %i, %i\n",
event->data.channel.channel,
event->data.channel.param1,
event->data.channel.param2);
+*/
channel = &track->channels[event->data.channel.channel];
key = event->data.channel.param1;
@@ -921,9 +948,26 @@
unsigned int freq_index;
unsigned int octave;
unsigned int sub_index;
+ unsigned int instr_num;
+ unsigned int note;
- freq_index = 64 + 32 * voice->note + voice->channel->bend;
+ note = voice->note;
+ // What instrument number is this?
+ // Certain instruments have all notes offset down by one octave.
+ // Use the octave offset table to work out if this voice should
+ // be offset.
+
+ instr_num = voice->current_instr - main_instrs;
+
+ if (instr_num < 128 && note >= 12
+ && octave_offset_table[voice->current_instr_voice][instr_num])
+ {
+ note -= 12;
+ }
+
+ freq_index = 64 + 32 * note + voice->channel->bend;
+
// If this is the second voice of a double voice instrument, the
// frequency index can be adjusted by the fine tuning field.
@@ -1037,10 +1081,12 @@
unsigned int key;
unsigned int volume;
+/*
printf("note on: channel %i, %i, %i\n",
event->data.channel.channel,
event->data.channel.param1,
event->data.channel.param2);
+*/
// The channel.
@@ -1113,10 +1159,12 @@
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);
+*/
channel = &track->channels[event->data.channel.channel];
controller = event->data.channel.param1;