@ -45,6 +45,10 @@ CMIDIDevice::CMIDIDevice (CMiniDexed *pSynthesizer, CConfig *pConfig)
: m_pSynthesizer ( pSynthesizer ) ,
m_pConfig ( pConfig )
{
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_ChannelMap [ nTG ] = Disabled ;
}
}
CMIDIDevice : : ~ CMIDIDevice ( void )
@ -52,6 +56,18 @@ CMIDIDevice::~CMIDIDevice (void)
m_pSynthesizer = 0 ;
}
void CMIDIDevice : : SetChannel ( u8 ucChannel , unsigned nTG )
{
assert ( nTG < CConfig : : ToneGenerators ) ;
m_ChannelMap [ nTG ] = ucChannel ;
}
u8 CMIDIDevice : : GetChannel ( unsigned nTG ) const
{
assert ( nTG < CConfig : : ToneGenerators ) ;
return m_ChannelMap [ nTG ] ;
}
void CMIDIDevice : : MIDIMessageHandler ( const u8 * pMessage , size_t nLength , unsigned nCable )
{
assert ( m_pSynthesizer ! = 0 ) ;
@ -67,17 +83,17 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
if ( pMessage [ 0 ] ! = MIDI_TIMING_CLOCK
& & pMessage [ 0 ] ! = MIDI_ACTIVE_SENSING )
{
printf ( " MIDI %u: %02X \n " , nCable , ( unsigned ) pMessage [ 0 ] ) ;
printf ( " MIDI%u: %02X \n " , nCable , ( unsigned ) pMessage [ 0 ] ) ;
}
break ;
case 2 :
printf ( " MIDI %u: %02X %02X \n " , nCable ,
printf ( " MIDI%u: %02X %02X \n " , nCable ,
( unsigned ) pMessage [ 0 ] , ( unsigned ) pMessage [ 1 ] ) ;
break ;
case 3 :
printf ( " MIDI %u: %02X %02X %02X \n " , nCable ,
printf ( " MIDI%u: %02X %02X %02X \n " , nCable ,
( unsigned ) pMessage [ 0 ] , ( unsigned ) pMessage [ 1 ] ,
( unsigned ) pMessage [ 2 ] ) ;
break ;
@ -90,11 +106,14 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
}
u8 ucStatus = pMessage [ 0 ] ;
// TODO: u8 ucChannel = ucStatus & 0x0F;
u8 ucChannel = ucStatus & 0x0F ;
u8 ucType = ucStatus > > 4 ;
u8 ucKeyNumber = pMessage [ 1 ] ;
u8 ucVelocity = pMessage [ 2 ] ;
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
if ( m_ChannelMap [ nTG ] = = ucChannel
| | m_ChannelMap [ nTG ] = = OmniMode )
{
switch ( ucType )
{
case MIDI_NOTE_ON :
@ -103,22 +122,17 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
break ;
}
if ( ucVelocity > 0 )
{
if ( ucVelocity < = 127 )
if ( pMessage [ 2 ] > 0 )
{
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
if ( pMessage [ 2 ] < = 127 )
{
m_pSynthesizer - > keydown ( ucKeyNumber , ucVelocity , nTG ) ;
}
m_pSynthesizer - > keydown ( pMessage [ 1 ] ,
pMessage [ 2 ] , nTG ) ;
}
}
else
{
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > keyup ( ucKeyNumber , nTG ) ;
}
m_pSynthesizer - > keyup ( pMessage [ 1 ] , nTG ) ;
}
break ;
@ -128,10 +142,7 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
break ;
}
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > keyup ( ucKeyNumber , nTG ) ;
}
m_pSynthesizer - > keyup ( pMessage [ 1 ] , nTG ) ;
break ;
case MIDI_CONTROL_CHANGE :
@ -143,41 +154,26 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
switch ( pMessage [ 1 ] )
{
case MIDI_CC_MODULATION :
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > setModWheel ( pMessage [ 2 ] , nTG ) ;
m_pSynthesizer - > ControllersRefresh ( nTG ) ;
}
break ;
case MIDI_CC_VOLUME :
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > SetVolume ( pMessage [ 2 ] , nTG ) ;
}
break ;
case MIDI_CC_BANK_SELECT_LSB :
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > BankSelectLSB ( pMessage [ 2 ] , nTG ) ;
}
break ;
case MIDI_CC_BANK_SUSTAIN :
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > setSustain ( pMessage [ 2 ] > = 64 , nTG ) ;
}
break ;
}
break ;
case MIDI_PROGRAM_CHANGE :
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > ProgramChange ( pMessage [ 1 ] , nTG ) ;
}
break ;
case MIDI_PITCH_BEND : {
@ -190,13 +186,12 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
nValue | = ( s16 ) pMessage [ 2 ] < < 7 ;
nValue - = 0x2000 ;
for ( unsigned nTG = 0 ; nTG < CConfig : : ToneGenerators ; nTG + + )
{
m_pSynthesizer - > setPitchbend ( nValue , nTG ) ;
}
} break ;
default :
break ;
}
}
}
}