More sysex implementations

pull/287/head
BeZo 2 years ago
parent bbd3db359c
commit d62cbb724f
  1. 48
      build.sh
  2. 94
      src/mididevice.cpp
  3. 1
      src/mididevice.h
  4. 3
      src/minidexed.cpp

@ -22,32 +22,32 @@ if [ "${RPI}" -gt "1" ]; then
fi fi
# Build circle-stdlib library # Build circle-stdlib library
cd circle-stdlib/ #cd circle-stdlib/
if [ ! -z "${CLEAN}" ] ; then #if [ ! -z "${CLEAN}" ] ; then
make mrproper || true #make mrproper || true
fi #fi
./configure -r ${RPI} --prefix "${TOOLCHAIN_PREFIX}" ${OPTIONS} -o KERNEL_MAX_SIZE=0x400000 #./configure -r ${RPI} --prefix "${TOOLCHAIN_PREFIX}" ${OPTIONS} -o KERNEL_MAX_SIZE=0x400000
make -j #make -j
# Build additional libraries # Build additional libraries
cd libs/circle/addon/display/ #cd libs/circle/addon/display/
if [ ! -z "${CLEAN}" ] ; then #if [ ! -z "${CLEAN}" ] ; then
make clean || true #make clean || true
fi #fi
make -j #make -j
cd ../sensor/ #cd ../sensor/
if [ ! -z "${CLEAN}" ] ; then #if [ ! -z "${CLEAN}" ] ; then
make clean || true #make clean || true
fi #fi
make -j #make -j
cd ../Properties/ #cd ../Properties/
if [ ! -z "${CLEAN}" ] ; then #if [ ! -z "${CLEAN}" ] ; then
make clean || true #make clean || true
fi #fi
make -j #make -j
cd ../../../.. #cd ../../../..
cd .. #cd ..
# Build MiniDexed # Build MiniDexed
echo "Build MiniDexed" echo "Build MiniDexed"

@ -184,11 +184,11 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
{ {
// MIDI SYSEX per MIDI channel // MIDI SYSEX per MIDI channel
uint8_t ucSysExChannel = (pMessage[2] & 0x07); uint8_t ucSysExChannel = (pMessage[2] & 0x07);
if (m_ChannelMap[nTG] == ucSysExChannel || m_ChannelMap[nTG] == OmniMode) if ( nTG == ucSysExChannel || m_ChannelMap[nTG] == OmniMode )
{ {
LOGNOTE("MIDI-SYSEX: channel: %u, len: %u, TG: %u",m_ChannelMap[nTG],nLength,nTG); LOGNOTE("MIDI-SYSEX: channel: %u, len: %u, TG: %u",m_ChannelMap[nTG],nLength,nTG);
printf("MIDI-SYSEX: channel: %u, len: %lu, TG: %u",m_ChannelMap[nTG],nLength,nTG); //printf("MIDI-SYSEX: channel: %u, len: %lu, TG: %u",m_ChannelMap[nTG],nLength,nTG);
HandleSystemExclusive(pMessage, nLength, nCable, nTG); HandleSystemExclusive(pMessage, nLength, nCable, ucSysExChannel);
} }
} }
else else
@ -334,9 +334,15 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
{ {
int16_t sysex_return; int16_t sysex_return;
if ( nTG >= CConfig::ToneGenerators ) return;
sysex_return = m_pSynthesizer->checkSystemExclusive(pMessage, nLength, nTG); sysex_return = m_pSynthesizer->checkSystemExclusive(pMessage, nLength, nTG);
uint8_t instanceID = pMessage[2]&0xF; uint8_t instanceID = pMessage[2]&0xF;
if ( instanceID != nTG ) { printf("WARNING instanceID and nTG do not match!!!!!\n"); }
LOGDBG("SYSEX handler return value: %d", sysex_return); LOGDBG("SYSEX handler return value: %d", sysex_return);
//printf("SYSEX handler return value: %d for TG %i", sysex_return, instanceID);
switch (sysex_return) switch (sysex_return)
{ {
@ -429,6 +435,14 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
m_pSynthesizer->setAftertouchTarget(pMessage[5],nTG); m_pSynthesizer->setAftertouchTarget(pMessage[5],nTG);
break; break;
/* BeZo patches */ /* BeZo patches */
case 78: // bank select
LOGDBG("Bank Select for TG %i\n", instanceID);
m_pSynthesizer->BankSelectLSB (pMessage[5], instanceID);
break;
case 79: // pgm select
LOGDBG("Patch Select for TG %i\n", instanceID);
m_pSynthesizer->ProgramChange (pMessage[5], instanceID);
break;
case 80: // Set midi channel case 80: // Set midi channel
LOGDBG("Set midi channel for TG %i", instanceID); LOGDBG("Set midi channel for TG %i", instanceID);
m_pSynthesizer->SetMIDIChannel(pMessage[5], instanceID); m_pSynthesizer->SetMIDIChannel(pMessage[5], instanceID);
@ -438,8 +452,12 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
m_pSynthesizer->SetReverbSend (maplong (pMessage[5], 0, 127, 0, 99), instanceID); m_pSynthesizer->SetReverbSend (maplong (pMessage[5], 0, 127, 0, 99), instanceID);
break; break;
case 82: // Compressor toggle case 82: // Compressor toggle
LOGDBG("Set Compressor ");
m_pSynthesizer->SetParameter (CMiniDexed::ParameterCompressorEnable, maplong (pMessage[5], 0, 127, 0, 1) );
break; break;
case 83: // Transpose case 83: // Transpose
LOGDBG("Set Transpose for TG %i", instanceID);
// m_pSynthesizer->SetTranspose (maplong (pMessage[5], 0, 127, 0, 99), instanceID);
break; break;
case 84: // Detune case 84: // Detune
LOGDBG("Set detune for TG %i", instanceID); LOGDBG("Set detune for TG %i", instanceID);
@ -464,6 +482,16 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
case 87: // Pitch Bend case 87: // Pitch Bend
break; break;
case 88: // Portamento case 88: // Portamento
LOGDBG("Set portamento mode for TG %i", instanceID);
m_pSynthesizer->setPortamentoMode(pMessage[5],instanceID);
break;
case 89: // Mono Mode
LOGDBG("Set Mono mode for TG %i", instanceID);
m_pSynthesizer->setMonoMode(pMessage[5],instanceID);
break;
case 600: // Config requestnTG
LOGDBG("Config request received\n");
SendSystemExclusiveConfig(nCable);
break; break;
/* End of BeZo patches */ /* End of BeZo patches */
case 100: case 100:
@ -480,7 +508,7 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
if(sysex_return >= 300 && sysex_return < 500) if(sysex_return >= 300 && sysex_return < 500)
{ {
LOGDBG("SysEx voice parameter change: Parameter %d value: %d",pMessage[4] + ((pMessage[3] & 0x03) * 128), pMessage[5]); LOGDBG("SysEx voice parameter change: Parameter %d value: %d",pMessage[4] + ((pMessage[3] & 0x03) * 128), pMessage[5]);
m_pSynthesizer->setVoiceDataElement(pMessage[4] + ((pMessage[3] & 0x03) * 128), pMessage[5],nTG); m_pSynthesizer->setVoiceDataElement(pMessage[4] + ((pMessage[3] & 0x03) * 128), pMessage[5],instanceID);
switch(pMessage[4] + ((pMessage[3] & 0x03) * 128)) switch(pMessage[4] + ((pMessage[3] & 0x03) * 128))
{ {
case 134: case 134:
@ -491,8 +519,7 @@ void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nL
else if(sysex_return >= 500 && sysex_return < 600) else if(sysex_return >= 500 && sysex_return < 600)
{ {
LOGDBG("SysEx send voice %u request",sysex_return-500); LOGDBG("SysEx send voice %u request",sysex_return-500);
printf("SysEx send voice %u request",sysex_return-500); SendSystemExclusiveVoice(sysex_return-500, nCable, instanceID);
SendSystemExclusiveVoice(sysex_return-500, nCable, nTG);
} }
break; break;
} }
@ -514,3 +541,58 @@ void CMIDIDevice::SendSystemExclusiveVoice(uint8_t nVoice, const unsigned nCable
LOGDBG("Send SYSEX voice dump %u to \"%s\"",nVoice,Iterator->first.c_str()); LOGDBG("Send SYSEX voice dump %u to \"%s\"",nVoice,Iterator->first.c_str());
} }
} }
void CMIDIDevice::SendSystemExclusiveConfig(const unsigned nCable)
{
uint8_t count = 0;
uint8_t configdump[196];
configdump[count++] = 0xF0;
configdump[count++] = 0x43;
configdump[count++] = 0x31;
for ( uint8_t instance = 0 ; instance < CConfig::ToneGenerators; instance++)
{
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterVoiceBank, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterProgram, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterMIDIChannel, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterVolume, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPan, instance) & 0x7F;
int16_t mastertune = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterMasterTune, instance);
configdump[count++] = (mastertune >> 9)&0x7f;
configdump[count++] = (mastertune & 0x7f);
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterCutoff, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterResonance, instance) & 0x7F;
configdump[count++] = 0; // Note limit low
configdump[count++] = 127; // Note limit high
configdump[count++] = 0; // Note shift
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterReverbSend, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPitchBendRange, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPitchBendStep, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPortamentoMode, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPortamentoGlissando, instance) & 0x7F;
configdump[count++] = m_pSynthesizer->GetTGParameter(CMiniDexed::TGParameterPortamentoTime, instance) & 0x7F;
configdump[count++] = 0;
configdump[count++] = 0;
configdump[count++] = 0;
configdump[count++] = 0;
configdump[count++] = 0;
configdump[count++] = 0;
}
configdump[count++] = 0xF7;
// for ( size_t i=0 ; i< count; i++)
// {
// printf("%02X, ", configdump[i]);
// if ( (i+1) % 16 == 0 ) printf ("\n");
// }
TDeviceMap::const_iterator Iterator;
// send voice dump to all MIDI interfaces
for(Iterator = s_DeviceMap.begin(); Iterator != s_DeviceMap.end(); ++Iterator)
{
Iterator->second->Send (configdump, sizeof(configdump)*sizeof(uint8_t));
LOGDBG("Send SYSEX config dump to \"%s\"",Iterator->first.c_str());
}
}

@ -51,6 +51,7 @@ public:
virtual void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) {} virtual void Send (const u8 *pMessage, size_t nLength, unsigned nCable = 0) {}
virtual void SendSystemExclusiveVoice(uint8_t nVoice, const unsigned nCable, uint8_t nTG); virtual void SendSystemExclusiveVoice(uint8_t nVoice, const unsigned nCable, uint8_t nTG);
virtual void SendSystemExclusiveConfig(const unsigned nCable);
protected: protected:
void MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsigned nCable = 0); void MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsigned nCable = 0);

@ -1194,7 +1194,8 @@ void CMiniDexed::getSysExVoiceDump(uint8_t* dest, uint8_t nTG)
dest[0] = 0xF0; // SysEx start dest[0] = 0xF0; // SysEx start
dest[1] = 0x43; // ID=Yamaha dest[1] = 0x43; // ID=Yamaha
dest[2] = GetTGParameter(TGParameterMIDIChannel, nTG); // Sub-status and MIDI channel // dest[2] = GetTGParameter(TGParameterMIDIChannel, nTG); // Sub-status and MIDI channel
dest[2] = nTG; // Sub-status and MIDI channel/Instance ID
dest[3] = 0x00; // Format number (0=1 voice) dest[3] = 0x00; // Format number (0=1 voice)
dest[4] = 0x01; // Byte count MSB dest[4] = 0x01; // Byte count MSB
dest[5] = 0x1B; // Byte count LSB dest[5] = 0x1B; // Byte count LSB

Loading…
Cancel
Save