1
0
Fork 0
forked from len0rd/rockbox

MIDI: Fix ringing/beeks in music caused by improper parsing of some pitch bend events.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15252 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Stepan Moskovchenko 2007-10-21 19:47:33 +00:00
parent 6fac8fcc93
commit 47d8323deb
4 changed files with 47 additions and 6 deletions

View file

@ -28,7 +28,8 @@ int chPW[16] IBSS_ATTR; /* Channel pitch wheel, MSB only */
int chPBDepth[16] IBSS_ATTR; /* Channel pitch bend depth */
int chPBNoteOffset[16] IBSS_ATTR; /* Pre-computed whole semitone offset */
int chPBFractBend[16] IBSS_ATTR; /* Fractional bend applied to delta */
unsigned char chLastCtrlMSB[16]; /* MIDI regs, used for Controller 6. */
unsigned char chLastCtrlLSB[16]; /* The non-registered ones are ignored */
struct GPatch * gusload(char *);
struct GPatch * patchSet[128];

View file

@ -62,10 +62,19 @@
#define MIDI_PITCHW 224
/* MIDI Controllers */
#define CTRL_PWDEPTH 6
#define CTRL_DATAENT_MSB 6
#define CTRL_VOLUME 7
#define CTRL_BALANCE 8
#define CTRL_PANNING 10
#define CTRL_NONREG_LSB 98
#define CTRL_NONREG_MSB 99
#define CTRL_REG_LSB 100
#define CTRL_REG_MSB 101
#define REG_PITCHBEND_MSB 0
#define REG_PITCHBEND_LSB 0
#define CHANNEL 1
/* Most of these are deprecated.. rampdown is used, maybe one other one too */
@ -145,8 +154,8 @@ extern int chPW[16]; /* Channel pitch wheel, MSB only */
extern int chPBDepth[16]; /* Channel pitch bend depth (Controller 6 */
extern int chPBNoteOffset[16] IBSS_ATTR; /* Pre-computed whole semitone offset */
extern int chPBFractBend[16] IBSS_ATTR; /* Fractional bend applied to delta */
extern unsigned char chLastCtrlMSB[16]; /* MIDI regs, used for Controller 6. */
extern unsigned char chLastCtrlLSB[16]; /* The non-registered ones are ignored */
extern struct GPatch * gusload(char *);
extern struct GPatch * patchSet[128];

View file

@ -299,10 +299,39 @@ static void sendEvent(struct Event * ev)
chPan[status_low]=d2;
return;
}
case CTRL_PWDEPTH:
case CTRL_DATAENT_MSB:
{
/* TODO: Update all deltas. Is this really needed? */
chPBDepth[status_low] = d2;
if(chLastCtrlMSB[status_low] == REG_PITCHBEND_MSB &&
chLastCtrlLSB[status_low] == REG_PITCHBEND_LSB)
{
// printf("Pitch bend depth set to %d\n", d2);
chPBDepth[status_low] = d2;
}
return;
}
case CTRL_NONREG_LSB:
{
chLastCtrlLSB[status_low] = 0xFF; /* Ignore nonregistered writes */
return;
}
case CTRL_NONREG_MSB:
{
chLastCtrlMSB[status_low] = 0xFF; /* Ignore nonregistered writes */
return;
}
case CTRL_REG_LSB:
{
chLastCtrlLSB[status_low] = d2;
return;
}
case CTRL_REG_MSB:
{
chLastCtrlMSB[status_low] = d2;
return;
}

View file

@ -68,6 +68,8 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig)
chPBDepth[a]=2; /* Default bend value is 2 */
chPBNoteOffset[a]=0; /* No offset */
chPBFractBend[a]=65536; /* Center.. no bend */
chLastCtrlMSB[a]=0; /* Set to pitch bend depth */
chLastCtrlLSB[a]=0; /* Set to pitch bend depth */
}
for(a=0; a<128; a++)
{