diff --git a/src/mididevice.cpp b/src/mididevice.cpp index fadfd61..371a070 100644 --- a/src/mididevice.cpp +++ b/src/mididevice.cpp @@ -29,7 +29,7 @@ #include #include "userinterface.h" -LOGMODULE("mididevice"); +LOGMODULE ("mididevice"); #define MIDI_NOTE_OFF 0b1000 #define MIDI_NOTE_ON 0b1001 @@ -47,15 +47,18 @@ LOGMODULE("mididevice"); #define MIDI_CC_RESONANCE 71 #define MIDI_CC_FREQUENCY_CUTOFF 74 #define MIDI_CC_REVERB_LEVEL 91 -#define MIDI_CC_ORBITONE_LEVEL 92 // added with mixing console -#define MIDI_CC_CHORUS_LEVEL 93 // added with mixing console #define MIDI_CC_DETUNE_LEVEL 94 -#define MIDI_CC_PHASER_LEVEL 95 // added with mixing console #define MIDI_CC_ALL_SOUND_OFF 120 #define MIDI_CC_ALL_NOTES_OFF 123 #define MIDI_PROGRAM_CHANGE 0b1100 #define MIDI_PITCH_BEND 0b1110 +#if defined(MIXING_CONSOLE_ENABLE) +#define MIDI_CC_ORBITONE_LEVEL 92 // added with mixing console +#define MIDI_CC_CHORUS_LEVEL 93 // added with mixing console +#define MIDI_CC_PHASER_LEVEL 95 // added with mixing console +#endif + #define MIDI_SYSTEM_EXCLUSIVE_BEGIN 0xF0 #define MIDI_SYSTEM_EXCLUSIVE_END 0xF7 #define MIDI_TIMING_CLOCK 0xF8 @@ -74,93 +77,94 @@ CMIDIDevice::CMIDIDevice(CMiniDexed *pSynthesizer, CConfig *pConfig, CUserInterf } } -CMIDIDevice::~CMIDIDevice(void) +CMIDIDevice::~CMIDIDevice (void) { m_pSynthesizer = 0; } -void CMIDIDevice::SetChannel(u8 ucChannel, unsigned nTG) +void CMIDIDevice::SetChannel (u8 ucChannel, unsigned nTG) { - assert(nTG < CConfig::ToneGenerators); + assert (nTG < CConfig::ToneGenerators); m_ChannelMap[nTG] = ucChannel; } -u8 CMIDIDevice::GetChannel(unsigned nTG) const +u8 CMIDIDevice::GetChannel (unsigned nTG) const { - assert(nTG < CConfig::ToneGenerators); + assert (nTG < CConfig::ToneGenerators); return m_ChannelMap[nTG]; } -void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigned nCable) +void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsigned nCable) { // The packet contents are just normal MIDI data - see // https://www.midi.org/specifications/item/table-1-summary-of-midi-message - if (m_pConfig->GetMIDIDumpEnabled()) + if (m_pConfig->GetMIDIDumpEnabled ()) { switch (nLength) { case 1: - if (pMessage[0] != MIDI_TIMING_CLOCK && pMessage[0] != MIDI_ACTIVE_SENSING) + 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, - (unsigned)pMessage[0], (unsigned)pMessage[1]); + printf ("MIDI%u: %02X %02X\n", nCable, + (unsigned) pMessage[0], (unsigned) pMessage[1]); break; case 3: - printf("MIDI%u: %02X %02X %02X\n", nCable, - (unsigned)pMessage[0], (unsigned)pMessage[1], - (unsigned)pMessage[2]); + printf ("MIDI%u: %02X %02X %02X\n", nCable, + (unsigned) pMessage[0], (unsigned) pMessage[1], + (unsigned) pMessage[2]); break; default: - switch (pMessage[0]) + switch(pMessage[0]) { - case MIDI_SYSTEM_EXCLUSIVE_BEGIN: - printf("MIDI%u: SysEx data length: [%d]:", nCable, uint16_t(nLength)); - for (uint16_t i = 0; i < nLength; i++) - { - if ((i % 16) == 0) - printf("\n%04d:", i); - printf(" 0x%02x", pMessage[i]); - } - printf("\n"); - break; - default: - printf("MIDI%u: Unhandled MIDI event type %0x02x\n", nCable, pMessage[0]); + case MIDI_SYSTEM_EXCLUSIVE_BEGIN: + printf("MIDI%u: SysEx data length: [%d]:",nCable, uint16_t(nLength)); + for (uint16_t i = 0; i < nLength; i++) + { + if((i % 16) == 0) + printf("\n%04d:",i); + printf(" 0x%02x",pMessage[i]); + } + printf("\n"); + break; + default: + printf("MIDI%u: Unhandled MIDI event type %0x02x\n",nCable,pMessage[0]); } break; } } // Only for debugging: - /* - if(pMessage[0]==MIDI_SYSTEM_EXCLUSIVE_BEGIN) +/* + if(pMessage[0]==MIDI_SYSTEM_EXCLUSIVE_BEGIN) + { + printf("MIDI%u: SysEx data length: [%d]:",nCable, uint16_t(nLength)); + for (uint16_t i = 0; i < nLength; i++) { - printf("MIDI%u: SysEx data length: [%d]:",nCable, uint16_t(nLength)); - for (uint16_t i = 0; i < nLength; i++) - { - if((i % 16) == 0) - printf("\n%04d:",i); - printf(" 0x%02x",pMessage[i]); - } - printf("\n"); + if((i % 16) == 0) + printf("\n%04d:",i); + printf(" 0x%02x",pMessage[i]); } - */ + printf("\n"); + } +*/ // Handle MIDI Thru - if (m_DeviceName.compare(m_pConfig->GetMIDIThruIn()) == 0) + if (m_DeviceName.compare (m_pConfig->GetMIDIThruIn ()) == 0) { TDeviceMap::const_iterator Iterator; - Iterator = s_DeviceMap.find(m_pConfig->GetMIDIThruOut()); - if (Iterator != s_DeviceMap.end()) + Iterator = s_DeviceMap.find (m_pConfig->GetMIDIThruOut ()); + if (Iterator != s_DeviceMap.end ()) { - Iterator->second->Send(pMessage, nLength, nCable); + Iterator->second->Send (pMessage, nLength, nCable); } } @@ -170,17 +174,17 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne return; } - m_MIDISpinLock.Acquire(); + m_MIDISpinLock.Acquire (); - u8 ucStatus = pMessage[0]; + u8 ucStatus = pMessage[0]; u8 ucChannel = ucStatus & 0x0F; - u8 ucType = ucStatus >> 4; + u8 ucType = ucStatus >> 4; // GLOBAL MIDI SYSEX - if (pMessage[0] == MIDI_SYSTEM_EXCLUSIVE_BEGIN && pMessage[3] == 0x04 && pMessage[4] == 0x01 && pMessage[nLength - 1] == MIDI_SYSTEM_EXCLUSIVE_END) // MASTER VOLUME + if (pMessage[0] == MIDI_SYSTEM_EXCLUSIVE_BEGIN && pMessage[3] == 0x04 && pMessage[4] == 0x01 && pMessage[nLength-1] == MIDI_SYSTEM_EXCLUSIVE_END) // MASTER VOLUME { - float32_t nMasterVolume = ((pMessage[5] & 0x7c) & ((pMessage[6] & 0x7c) << 7)) / (1 << 14); - LOGNOTE("Master volume: %f", nMasterVolume); + float32_t nMasterVolume=((pMessage[5] & 0x7c) & ((pMessage[6] & 0x7c) <<7))/(1<<14); + LOGNOTE("Master volume: %f",nMasterVolume); m_pSynthesizer->setMasterVolume(nMasterVolume); } else @@ -193,9 +197,9 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne case MIDI_NOTE_ON: if (nLength < 3) { - break; + break; } - m_pUI->UIMIDICmdHandler(ucChannel, ucStatus & 0xF0, pMessage[1], pMessage[2]); + m_pUI->UIMIDICmdHandler (ucChannel, ucStatus & 0xF0, pMessage[1], pMessage[2]); break; } @@ -208,13 +212,14 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne uint8_t ucSysExChannel = (pMessage[2] & 0x0F); if (m_ChannelMap[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); HandleSystemExclusive(pMessage, nLength, nCable, nTG); } } else { - if (m_ChannelMap[nTG] == ucChannel || m_ChannelMap[nTG] == OmniMode) + if ( m_ChannelMap[nTG] == ucChannel + || m_ChannelMap[nTG] == OmniMode) { switch (ucType) { @@ -223,87 +228,87 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne { break; } - + if (pMessage[2] > 0) { if (pMessage[2] <= 127) { - m_pSynthesizer->keydown(pMessage[1], - pMessage[2], nTG); + m_pSynthesizer->keydown (pMessage[1], + pMessage[2], nTG); } } else { - m_pSynthesizer->keyup(pMessage[1], nTG); + m_pSynthesizer->keyup (pMessage[1], nTG); } break; - + case MIDI_NOTE_OFF: if (nLength < 3) { break; } - - m_pSynthesizer->keyup(pMessage[1], nTG); + + m_pSynthesizer->keyup (pMessage[1], nTG); break; - + case MIDI_CHANNEL_AFTERTOUCH: - - m_pSynthesizer->setAftertouch(pMessage[1], nTG); - m_pSynthesizer->ControllersRefresh(nTG); + + m_pSynthesizer->setAftertouch (pMessage[1], nTG); + m_pSynthesizer->ControllersRefresh (nTG); break; - + case MIDI_CONTROL_CHANGE: if (nLength < 3) { break; } - + switch (pMessage[1]) { case MIDI_CC_MODULATION: - m_pSynthesizer->setModWheel(pMessage[2], nTG); - m_pSynthesizer->ControllersRefresh(nTG); + m_pSynthesizer->setModWheel (pMessage[2], nTG); + m_pSynthesizer->ControllersRefresh (nTG); break; - + case MIDI_CC_FOOT_PEDAL: - m_pSynthesizer->setFootController(pMessage[2], nTG); - m_pSynthesizer->ControllersRefresh(nTG); + m_pSynthesizer->setFootController (pMessage[2], nTG); + m_pSynthesizer->ControllersRefresh (nTG); break; case MIDI_CC_BREATH_CONTROLLER: - m_pSynthesizer->setBreathController(pMessage[2], nTG); - m_pSynthesizer->ControllersRefresh(nTG); + m_pSynthesizer->setBreathController (pMessage[2], nTG); + m_pSynthesizer->ControllersRefresh (nTG); break; - + case MIDI_CC_VOLUME: - m_pSynthesizer->SetVolume(pMessage[2], nTG); + m_pSynthesizer->SetVolume (pMessage[2], nTG); break; - + case MIDI_CC_PAN_POSITION: - m_pSynthesizer->SetPan(pMessage[2], nTG); + m_pSynthesizer->SetPan (pMessage[2], nTG); break; - + case MIDI_CC_BANK_SELECT_MSB: - m_pSynthesizer->BankSelectMSB(pMessage[2], nTG); + m_pSynthesizer->BankSelectMSB (pMessage[2], nTG); break; - + case MIDI_CC_BANK_SELECT_LSB: - m_pSynthesizer->BankSelectLSB(pMessage[2], nTG); + m_pSynthesizer->BankSelectLSB (pMessage[2], nTG); break; - + case MIDI_CC_BANK_SUSTAIN: - m_pSynthesizer->setSustain(pMessage[2] >= 64, nTG); + m_pSynthesizer->setSustain (pMessage[2] >= 64, nTG); break; - + case MIDI_CC_RESONANCE: - m_pSynthesizer->SetResonance(maplong(pMessage[2], 0, 127, 0, 99), nTG); + m_pSynthesizer->SetResonance (maplong (pMessage[2], 0, 127, 0, 99), nTG); break; - + case MIDI_CC_FREQUENCY_CUTOFF: - m_pSynthesizer->SetCutoff(maplong(pMessage[2], 0, 127, 0, 99), nTG); + m_pSynthesizer->SetCutoff (maplong (pMessage[2], 0, 127, 0, 99), nTG); break; - + case MIDI_CC_REVERB_LEVEL: #if defined(MIXING_CONSOLE_ENABLE) this->m_pSynthesizer->setMixingConsoleSendLevel(nTG, MixerOutput::FX_PlateReverb, maplong(pMessage[2], 0, 127, 0, 99)); @@ -328,51 +333,49 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne if (pMessage[2] == 0) { // "0 to 127, with 0 being no celeste (detune) effect applied at all." - m_pSynthesizer->SetMasterTune(0, nTG); + m_pSynthesizer->SetMasterTune (0, nTG); } else { - m_pSynthesizer->SetMasterTune(maplong(pMessage[2], 1, 127, -99, 99), nTG); + m_pSynthesizer->SetMasterTune (maplong (pMessage[2], 1, 127, -99, 99), nTG); } break; - + case MIDI_CC_ALL_SOUND_OFF: - m_pSynthesizer->panic(pMessage[2], nTG); + m_pSynthesizer->panic (pMessage[2], nTG); break; - + case MIDI_CC_ALL_NOTES_OFF: // As per "MIDI 1.0 Detailed Specification" v4.2 // From "ALL NOTES OFF" states: // "Receivers should ignore an All Notes Off message while Omni is on (Modes 1 & 2)" - if (!m_pConfig->GetIgnoreAllNotesOff() && m_ChannelMap[nTG] != OmniMode) + if (!m_pConfig->GetIgnoreAllNotesOff () && m_ChannelMap[nTG] != OmniMode) { - m_pSynthesizer->notesOff(pMessage[2], nTG); + m_pSynthesizer->notesOff (pMessage[2], nTG); } break; } break; - + case MIDI_PROGRAM_CHANGE: // do program change only if enabled in config - if (m_pConfig->GetMIDIRXProgramChange()) - m_pSynthesizer->ProgramChange(pMessage[1], nTG); + if( m_pConfig->GetMIDIRXProgramChange() ) + m_pSynthesizer->ProgramChange (pMessage[1], nTG); break; - - case MIDI_PITCH_BEND: - { + + case MIDI_PITCH_BEND: { if (nLength < 3) { break; } - + s16 nValue = pMessage[1]; - nValue |= (s16)pMessage[2] << 7; + nValue |= (s16) pMessage[2] << 7; nValue -= 0x2000; - - m_pSynthesizer->setPitchbend(nValue, nTG); - } - break; - + + m_pSynthesizer->setPitchbend (nValue, nTG); + } break; + default: break; } @@ -380,161 +383,161 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne } } } - m_MIDISpinLock.Release(); + m_MIDISpinLock.Release (); } -void CMIDIDevice::AddDevice(const char *pDeviceName) +void CMIDIDevice::AddDevice (const char *pDeviceName) { - assert(pDeviceName); + assert (pDeviceName); - assert(m_DeviceName.empty()); + assert (m_DeviceName.empty ()); m_DeviceName = pDeviceName; - assert(!m_DeviceName.empty()); + assert (!m_DeviceName.empty ()); - s_DeviceMap.insert(std::pair(pDeviceName, this)); + s_DeviceMap.insert (std::pair (pDeviceName, this)); } -void CMIDIDevice::HandleSystemExclusive(const uint8_t *pMessage, const size_t nLength, const unsigned nCable, const uint8_t nTG) +void CMIDIDevice::HandleSystemExclusive(const uint8_t* pMessage, const size_t nLength, const unsigned nCable, const uint8_t nTG) { - int16_t sysex_return; - - sysex_return = m_pSynthesizer->checkSystemExclusive(pMessage, nLength, nTG); - LOGDBG("SYSEX handler return value: %d", sysex_return); - - switch (sysex_return) - { - case -1: - LOGERR("SysEx end status byte not detected."); - break; - case -2: - LOGERR("SysEx vendor not Yamaha."); - break; - case -3: - LOGERR("Unknown SysEx parameter change."); - break; - case -4: - LOGERR("Unknown SysEx voice or function."); - break; - case -5: - LOGERR("Not a SysEx voice bulk upload."); - break; - case -6: - LOGERR("Wrong length for SysEx voice bulk upload (not 155)."); - break; - case -7: - LOGERR("Checksum error for one voice."); - break; - case -8: - LOGERR("Not a SysEx bank bulk upload."); - break; - case -9: - LOGERR("Wrong length for SysEx bank bulk upload (not 4096)."); - case -10: - LOGERR("Checksum error for bank."); - break; - case -11: - LOGERR("Unknown SysEx message."); - break; - case 64: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setMonoMode(pMessage[5], nTG); - break; - case 65: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setPitchbendRange(pMessage[5], nTG); - break; - case 66: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setPitchbendStep(pMessage[5], nTG); - break; - case 67: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setPortamentoMode(pMessage[5], nTG); - break; - case 68: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setPortamentoGlissando(pMessage[5], nTG); - break; - case 69: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setPortamentoTime(pMessage[5], nTG); - break; - case 70: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setModWheelRange(pMessage[5], nTG); - break; - case 71: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setModWheelTarget(pMessage[5], nTG); - break; - case 72: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setFootControllerRange(pMessage[5], nTG); - break; - case 73: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setFootControllerTarget(pMessage[5], nTG); - break; - case 74: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setBreathControllerRange(pMessage[5], nTG); - break; - case 75: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setBreathControllerTarget(pMessage[5], nTG); - break; - case 76: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setAftertouchRange(pMessage[5], nTG); - break; - case 77: - LOGDBG("SysEx Function parameter change: %d Value %d", pMessage[4], pMessage[5]); - m_pSynthesizer->setAftertouchTarget(pMessage[5], nTG); - break; - case 100: - // load sysex-data into voice memory - LOGDBG("One Voice bulk upload"); - m_pSynthesizer->loadVoiceParameters(pMessage, nTG); - break; - case 200: - LOGDBG("Bank bulk upload."); - // TODO: add code for storing a bank bulk upload - LOGNOTE("Currently code for storing a bulk bank upload is missing!"); - break; - default: - if (sysex_return >= 300 && sysex_return < 500) - { - 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); - switch (pMessage[4] + ((pMessage[3] & 0x03) * 128)) - { - case 134: - m_pSynthesizer->notesOff(0, nTG); - break; - } - } - else if (sysex_return >= 500 && sysex_return < 600) - { - LOGDBG("SysEx send voice %u request", sysex_return - 500); - SendSystemExclusiveVoice(sysex_return - 500, nCable, nTG); - } - break; - } + int16_t sysex_return; + + sysex_return = m_pSynthesizer->checkSystemExclusive(pMessage, nLength, nTG); + LOGDBG("SYSEX handler return value: %d", sysex_return); + + switch (sysex_return) + { + case -1: + LOGERR("SysEx end status byte not detected."); + break; + case -2: + LOGERR("SysEx vendor not Yamaha."); + break; + case -3: + LOGERR("Unknown SysEx parameter change."); + break; + case -4: + LOGERR("Unknown SysEx voice or function."); + break; + case -5: + LOGERR("Not a SysEx voice bulk upload."); + break; + case -6: + LOGERR("Wrong length for SysEx voice bulk upload (not 155)."); + break; + case -7: + LOGERR("Checksum error for one voice."); + break; + case -8: + LOGERR("Not a SysEx bank bulk upload."); + break; + case -9: + LOGERR("Wrong length for SysEx bank bulk upload (not 4096)."); + case -10: + LOGERR("Checksum error for bank."); + break; + case -11: + LOGERR("Unknown SysEx message."); + break; + case 64: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setMonoMode(pMessage[5],nTG); + break; + case 65: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setPitchbendRange(pMessage[5],nTG); + break; + case 66: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setPitchbendStep(pMessage[5],nTG); + break; + case 67: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setPortamentoMode(pMessage[5],nTG); + break; + case 68: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setPortamentoGlissando(pMessage[5],nTG); + break; + case 69: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setPortamentoTime(pMessage[5],nTG); + break; + case 70: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setModWheelRange(pMessage[5],nTG); + break; + case 71: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setModWheelTarget(pMessage[5],nTG); + break; + case 72: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setFootControllerRange(pMessage[5],nTG); + break; + case 73: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setFootControllerTarget(pMessage[5],nTG); + break; + case 74: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setBreathControllerRange(pMessage[5],nTG); + break; + case 75: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setBreathControllerTarget(pMessage[5],nTG); + break; + case 76: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setAftertouchRange(pMessage[5],nTG); + break; + case 77: + LOGDBG("SysEx Function parameter change: %d Value %d",pMessage[4],pMessage[5]); + m_pSynthesizer->setAftertouchTarget(pMessage[5],nTG); + break; + case 100: + // load sysex-data into voice memory + LOGDBG("One Voice bulk upload"); + m_pSynthesizer->loadVoiceParameters(pMessage,nTG); + break; + case 200: + LOGDBG("Bank bulk upload."); + //TODO: add code for storing a bank bulk upload + LOGNOTE("Currently code for storing a bulk bank upload is missing!"); + break; + default: + if(sysex_return >= 300 && sysex_return < 500) + { + 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); + switch(pMessage[4] + ((pMessage[3] & 0x03) * 128)) + { + case 134: + m_pSynthesizer->notesOff(0,nTG); + break; + } + } + else if(sysex_return >= 500 && sysex_return < 600) + { + LOGDBG("SysEx send voice %u request",sysex_return-500); + SendSystemExclusiveVoice(sysex_return-500, nCable, nTG); + } + break; + } } void CMIDIDevice::SendSystemExclusiveVoice(uint8_t nVoice, const unsigned nCable, uint8_t nTG) { - uint8_t voicedump[163]; + uint8_t voicedump[163]; - // Get voice sysex dump from TG - m_pSynthesizer->getSysExVoiceDump(voicedump, nTG); + // Get voice sysex dump from TG + m_pSynthesizer->getSysExVoiceDump(voicedump, nTG); - TDeviceMap::const_iterator Iterator; + TDeviceMap::const_iterator Iterator; - // send voice dump to all MIDI interfaces - for (Iterator = s_DeviceMap.begin(); Iterator != s_DeviceMap.end(); ++Iterator) - { - Iterator->second->Send(voicedump, sizeof(voicedump) * sizeof(uint8_t)); - // LOGDBG("Send SYSEX voice dump %u to \"%s\"",nVoice,Iterator->first.c_str()); - } -} + // send voice dump to all MIDI interfaces + for(Iterator = s_DeviceMap.begin(); Iterator != s_DeviceMap.end(); ++Iterator) + { + Iterator->second->Send (voicedump, sizeof(voicedump)*sizeof(uint8_t)); + // LOGDBG("Send SYSEX voice dump %u to \"%s\"",nVoice,Iterator->first.c_str()); + } +} diff --git a/src/performance.ini b/src/performance.ini index 78a5cba..cfa6f6b 100644 --- a/src/performance.ini +++ b/src/performance.ini @@ -37,7 +37,7 @@ VoiceNumber1=1 MIDIChannel1=255 Volume1=100 Pan1=64 -Detune1=-11 +Detune1=0 Cutoff1=99 Resonance1=0 NoteLimitLow1=0 @@ -66,7 +66,7 @@ VoiceNumber2=1 MIDIChannel2=255 Volume2=0 Pan2=127 -Detune2=11 +Detune2=0 Cutoff2=99 Resonance2=0 NoteLimitLow2=0 @@ -311,8 +311,6 @@ FXDelayEnable=1 FXDelayLeftDelayTime=15 FXDelayRightDelayTime=22 FXDelayFeedback=35 -FXDelayFlutterRate=0 -FXDelayFlutterAmount=0 FXReverberatorEnable=1 FXReverberatorInputGain=55 diff --git a/src/uimenu.cpp b/src/uimenu.cpp index f16cf21..9cead76 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -34,25 +34,25 @@ using namespace std; const CUIMenu::TMenuItem CUIMenu::s_MenuRoot[] = { - {"MiniDexed", CUIMenu::MenuHandler, CUIMenu::s_MainMenu}, + {"MiniDexed", MenuHandler, s_MainMenu}, {0} }; // inserting menu items before "TG1" affect TGShortcutHandler() const CUIMenu::TMenuItem CUIMenu::s_MainMenu[] = { - {"TG1", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 0}, + {"TG1", MenuHandler, s_TGMenu, 0}, #ifdef ARM_ALLOW_MULTI_CORE - {"TG2", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 1}, - {"TG3", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 2}, - {"TG4", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 3}, - {"TG5", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 4}, - {"TG6", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 5}, - {"TG7", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 6}, - {"TG8", CUIMenu::MenuHandler, CUIMenu::s_TGMenu, 7}, + {"TG2", MenuHandler, s_TGMenu, 1}, + {"TG3", MenuHandler, s_TGMenu, 2}, + {"TG4", MenuHandler, s_TGMenu, 3}, + {"TG5", MenuHandler, s_TGMenu, 4}, + {"TG6", MenuHandler, s_TGMenu, 5}, + {"TG7", MenuHandler, s_TGMenu, 6}, + {"TG8", MenuHandler, s_TGMenu, 7}, #endif - {"Effects", CUIMenu::MenuHandler, CUIMenu::s_EffectsMenu}, - {"Performance", CUIMenu::MenuHandler, CUIMenu::s_PerformanceMenu}, + {"Effects", MenuHandler, s_EffectsMenu}, + {"Performance", MenuHandler, s_PerformanceMenu}, {0} }; @@ -74,26 +74,21 @@ const CUIMenu::TMenuItem CUIMenu::s_TGFXMenu[] = const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] = { - {"Voice", CUIMenu::EditProgramNumber}, - {"Bank", CUIMenu::EditVoiceBankNumber}, - {"Volume", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterVolume}, + {"Voice", EditProgramNumber}, + {"Bank", EditVoiceBankNumber}, + {"Volume", EditTGParameter, 0, CMiniDexed::TGParameterVolume}, #ifdef ARM_ALLOW_MULTI_CORE - {"Pan", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterPan}, + {"Pan", EditTGParameter, 0, CMiniDexed::TGParameterPan}, #endif -#if defined(MIXING_CONSOLE_ENABLE) - {"FX-Send", CUIMenu::MenuHandler, CUIMenu::s_TGFXMenu}, -#elif defined(PLATE_REVERB_ENABLE) - {"Reverb-Send", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterReverbSend}, -#endif - {"Detune", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterMasterTune}, - {"Cutoff", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterCutoff}, - {"Resonance", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterResonance}, - {"Pitch Bend", CUIMenu::MenuHandler, CUIMenu::s_EditPitchBendMenu}, - {"Portamento", CUIMenu::MenuHandler, CUIMenu::s_EditPortamentoMenu}, - {"Poly/Mono", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterMonoMode}, - {"Modulation", CUIMenu::MenuHandler, CUIMenu::s_ModulationMenu}, - {"Channel", CUIMenu::EditTGParameter, 0, CMiniDexed::TTGParameter::TGParameterMIDIChannel}, - {"Edit Voice", CUIMenu::MenuHandler, CUIMenu::s_EditVoiceMenu}, + {"Detune", EditTGParameter, 0, CMiniDexed::TGParameterMasterTune}, + {"Cutoff", EditTGParameter, 0, CMiniDexed::TGParameterCutoff}, + {"Resonance", EditTGParameter, 0, CMiniDexed::TGParameterResonance}, + {"Pitch Bend", MenuHandler, s_EditPitchBendMenu}, + {"Portamento", MenuHandler, s_EditPortamentoMenu}, + {"Poly/Mono", EditTGParameter, 0, CMiniDexed::TGParameterMonoMode}, + {"Modulation", MenuHandler, s_ModulationMenu}, + {"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel}, + {"Edit Voice", MenuHandler, s_EditVoiceMenu}, {0} }; @@ -121,34 +116,34 @@ const CUIMenu::TMenuItem CUIMenu::s_EffectsMenu[] = const CUIMenu::TMenuItem CUIMenu::s_EditPitchBendMenu[] = { - {"Bend Range", CUIMenu::EditTGParameter2, 0, CMiniDexed::TTGParameter::TGParameterPitchBendRange}, - {"Bend Step", CUIMenu::EditTGParameter2, 0, CMiniDexed::TTGParameter::TGParameterPitchBendStep}, + {"Bend Range", EditTGParameter2, 0, CMiniDexed::TGParameterPitchBendRange}, + {"Bend Step", EditTGParameter2, 0, CMiniDexed::TGParameterPitchBendStep}, {0} }; const CUIMenu::TMenuItem CUIMenu::s_EditPortamentoMenu[] = { - {"Mode", CUIMenu::EditTGParameter2, 0, CMiniDexed::TTGParameter::TGParameterPortamentoMode}, - {"Glissando", CUIMenu::EditTGParameter2, 0, CMiniDexed::TTGParameter::TGParameterPortamentoGlissando}, - {"Time", CUIMenu::EditTGParameter2, 0, CMiniDexed::TTGParameter::TGParameterPortamentoTime}, + {"Mode", EditTGParameter2, 0, CMiniDexed::TGParameterPortamentoMode}, + {"Glissando", EditTGParameter2, 0, CMiniDexed::TGParameterPortamentoGlissando}, + {"Time", EditTGParameter2, 0, CMiniDexed::TGParameterPortamentoTime}, {0} }; const CUIMenu::TMenuItem CUIMenu::s_ModulationMenu[] = { - {"Mod. Wheel", CUIMenu::MenuHandler, CUIMenu::s_ModulationMenuParameters, CMiniDexed::TTGParameter::TGParameterMWRange}, - {"Foot Control", CUIMenu::MenuHandler, CUIMenu::s_ModulationMenuParameters, CMiniDexed::TTGParameter::TGParameterFCRange}, - {"Breath Control", CUIMenu::MenuHandler, CUIMenu::s_ModulationMenuParameters, CMiniDexed::TTGParameter::TGParameterBCRange}, - {"Aftertouch", CUIMenu::MenuHandler, CUIMenu::s_ModulationMenuParameters, CMiniDexed::TTGParameter::TGParameterATRange}, + {"Mod. Wheel", MenuHandler, s_ModulationMenuParameters, CMiniDexed::TGParameterMWRange}, + {"Foot Control", MenuHandler, s_ModulationMenuParameters, CMiniDexed::TGParameterFCRange}, + {"Breath Control", MenuHandler, s_ModulationMenuParameters, CMiniDexed::TGParameterBCRange}, + {"Aftertouch", MenuHandler, s_ModulationMenuParameters, CMiniDexed::TGParameterATRange}, {0} }; const CUIMenu::TMenuItem CUIMenu::s_ModulationMenuParameters[] = { - {"Range", CUIMenu::EditTGParameterModulation, 0, 0}, - {"Pitch", CUIMenu::EditTGParameterModulation, 0, 1}, - {"Amplitude", CUIMenu::EditTGParameterModulation, 0, 2}, - {"EG Bias", CUIMenu::EditTGParameterModulation, 0, 3}, + {"Range", EditTGParameterModulation, 0, 0}, + {"Pitch", EditTGParameterModulation, 0, 1}, + {"Amplitude", EditTGParameterModulation, 0, 2}, + {"EG Bias", EditTGParameterModulation, 0, 3}, {0} }; @@ -557,67 +552,67 @@ const CUIMenu::TMenuItem CUIMenu::s_FXMainOutputLevels[] = // inserting menu items before "OP1" affect OPShortcutHandler() const CUIMenu::TMenuItem CUIMenu::s_EditVoiceMenu[] = { - {"OP1", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 0}, - {"OP2", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 1}, - {"OP3", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 2}, - {"OP4", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 3}, - {"OP5", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 4}, - {"OP6", CUIMenu::MenuHandler, CUIMenu::s_OperatorMenu, 5}, - {"Algorithm", CUIMenu::EditVoiceParameter, 0, DEXED_ALGORITHM}, - {"Feedback", CUIMenu::EditVoiceParameter, 0, DEXED_FEEDBACK}, - {"P EG Rate 1", CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_R1}, - {"P EG Rate 2", CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_R2}, - {"P EG Rate 3", CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_R3}, - {"P EG Rate 4", CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_R4}, - {"P EG Level 1",CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_L1}, - {"P EG Level 2",CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_L2}, - {"P EG Level 3",CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_L3}, - {"P EG Level 4",CUIMenu::EditVoiceParameter, 0, DEXED_PITCH_EG_L4}, - {"Osc Key Sync",CUIMenu::EditVoiceParameter, 0, DEXED_OSC_KEY_SYNC}, - {"LFO Speed", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_SPEED}, - {"LFO Delay", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_DELAY}, - {"LFO PMD", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_PITCH_MOD_DEP}, - {"LFO AMD", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_AMP_MOD_DEP}, - {"LFO Sync", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_SYNC}, - {"LFO Wave", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_WAVE}, - {"P Mod Sens.", CUIMenu::EditVoiceParameter, 0, DEXED_LFO_PITCH_MOD_SENS}, - {"Transpose", CUIMenu::EditVoiceParameter, 0, DEXED_TRANSPOSE}, - {"Name", CUIMenu::InputTxt, 0, 3}, + {"OP1", MenuHandler, s_OperatorMenu, 0}, + {"OP2", MenuHandler, s_OperatorMenu, 1}, + {"OP3", MenuHandler, s_OperatorMenu, 2}, + {"OP4", MenuHandler, s_OperatorMenu, 3}, + {"OP5", MenuHandler, s_OperatorMenu, 4}, + {"OP6", MenuHandler, s_OperatorMenu, 5}, + {"Algorithm", EditVoiceParameter, 0, DEXED_ALGORITHM}, + {"Feedback", EditVoiceParameter, 0, DEXED_FEEDBACK}, + {"P EG Rate 1", EditVoiceParameter, 0, DEXED_PITCH_EG_R1}, + {"P EG Rate 2", EditVoiceParameter, 0, DEXED_PITCH_EG_R2}, + {"P EG Rate 3", EditVoiceParameter, 0, DEXED_PITCH_EG_R3}, + {"P EG Rate 4", EditVoiceParameter, 0, DEXED_PITCH_EG_R4}, + {"P EG Level 1",EditVoiceParameter, 0, DEXED_PITCH_EG_L1}, + {"P EG Level 2",EditVoiceParameter, 0, DEXED_PITCH_EG_L2}, + {"P EG Level 3",EditVoiceParameter, 0, DEXED_PITCH_EG_L3}, + {"P EG Level 4",EditVoiceParameter, 0, DEXED_PITCH_EG_L4}, + {"Osc Key Sync",EditVoiceParameter, 0, DEXED_OSC_KEY_SYNC}, + {"LFO Speed", EditVoiceParameter, 0, DEXED_LFO_SPEED}, + {"LFO Delay", EditVoiceParameter, 0, DEXED_LFO_DELAY}, + {"LFO PMD", EditVoiceParameter, 0, DEXED_LFO_PITCH_MOD_DEP}, + {"LFO AMD", EditVoiceParameter, 0, DEXED_LFO_AMP_MOD_DEP}, + {"LFO Sync", EditVoiceParameter, 0, DEXED_LFO_SYNC}, + {"LFO Wave", EditVoiceParameter, 0, DEXED_LFO_WAVE}, + {"P Mod Sens.", EditVoiceParameter, 0, DEXED_LFO_PITCH_MOD_SENS}, + {"Transpose", EditVoiceParameter, 0, DEXED_TRANSPOSE}, + {"Name", InputTxt,0 , 3}, {0} }; const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] = { - {"Output Level",CUIMenu::EditOPParameter, 0, DEXED_OP_OUTPUT_LEV}, - {"Freq Coarse", CUIMenu::EditOPParameter, 0, DEXED_OP_FREQ_COARSE}, - {"Freq Fine", CUIMenu::EditOPParameter, 0, DEXED_OP_FREQ_FINE}, - {"Osc Detune", CUIMenu::EditOPParameter, 0, DEXED_OP_OSC_DETUNE}, - {"Osc Mode", CUIMenu::EditOPParameter, 0, DEXED_OP_OSC_MODE}, - {"EG Rate 1", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_R1}, - {"EG Rate 2", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_R2}, - {"EG Rate 3", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_R3}, - {"EG Rate 4", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_R4}, - {"EG Level 1", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_L1}, - {"EG Level 2", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_L2}, - {"EG Level 3", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_L3}, - {"EG Level 4", CUIMenu::EditOPParameter, 0, DEXED_OP_EG_L4}, - {"Break Point", CUIMenu::EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT}, - {"L Key Depth", CUIMenu::EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH}, - {"R Key Depth", CUIMenu::EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH}, - {"L Key Scale", CUIMenu::EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE}, - {"R Key Scale", CUIMenu::EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE}, - {"Rate Scaling",CUIMenu::EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE}, - {"A Mod Sens.", CUIMenu::EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS}, - {"K Vel. Sens.",CUIMenu::EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS}, - {"Enable", CUIMenu::EditOPParameter, 0, DEXED_OP_ENABLE}, + {"Output Level",EditOPParameter, 0, DEXED_OP_OUTPUT_LEV}, + {"Freq Coarse", EditOPParameter, 0, DEXED_OP_FREQ_COARSE}, + {"Freq Fine", EditOPParameter, 0, DEXED_OP_FREQ_FINE}, + {"Osc Detune", EditOPParameter, 0, DEXED_OP_OSC_DETUNE}, + {"Osc Mode", EditOPParameter, 0, DEXED_OP_OSC_MODE}, + {"EG Rate 1", EditOPParameter, 0, DEXED_OP_EG_R1}, + {"EG Rate 2", EditOPParameter, 0, DEXED_OP_EG_R2}, + {"EG Rate 3", EditOPParameter, 0, DEXED_OP_EG_R3}, + {"EG Rate 4", EditOPParameter, 0, DEXED_OP_EG_R4}, + {"EG Level 1", EditOPParameter, 0, DEXED_OP_EG_L1}, + {"EG Level 2", EditOPParameter, 0, DEXED_OP_EG_L2}, + {"EG Level 3", EditOPParameter, 0, DEXED_OP_EG_L3}, + {"EG Level 4", EditOPParameter, 0, DEXED_OP_EG_L4}, + {"Break Point", EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT}, + {"L Key Depth", EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH}, + {"R Key Depth", EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH}, + {"L Key Scale", EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE}, + {"R Key Scale", EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE}, + {"Rate Scaling",EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE}, + {"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS}, + {"K Vel. Sens.",EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS}, + {"Enable", EditOPParameter, 0, DEXED_OP_ENABLE}, {0} }; const CUIMenu::TMenuItem CUIMenu::s_SaveMenu[] = { - {"Overwrite", CUIMenu::SavePerformance, 0, 0}, - {"New", CUIMenu::InputTxt, 0, 1}, - {"Save as default", CUIMenu::SavePerformance, 0, 1}, + {"Overwrite", SavePerformance, 0, 0}, + {"New", InputTxt,0 , 1}, + {"Save as default", SavePerformance, 0, 1}, {0} }; @@ -887,9 +882,9 @@ static const unsigned NoteC3 = 27; const CUIMenu::TMenuItem CUIMenu::s_PerformanceMenu[] = { - {"Load", CUIMenu::PerformanceMenu, 0, 0}, - {"Save", CUIMenu::MenuHandler, s_SaveMenu}, - {"Delete", CUIMenu::PerformanceMenu, 0, 1}, + {"Load", PerformanceMenu, 0, 0}, + {"Save", MenuHandler, s_SaveMenu}, + {"Delete", PerformanceMenu, 0, 1}, {0} }; diff --git a/wiki-update/Delay--Channel.png b/wiki-update/Delay--Channel.png index 11beb5a..026b553 100644 Binary files a/wiki-update/Delay--Channel.png and b/wiki-update/Delay--Channel.png differ diff --git a/wiki-update/mixing-console-overview.png b/wiki-update/mixing-console-overview.png index 8e229f3..0821431 100644 Binary files a/wiki-update/mixing-console-overview.png and b/wiki-update/mixing-console-overview.png differ