reducing changes due to reformatting and correction of wiki documentation

pull/499/head
Vincent GAUCHE 1 year ago
parent 253d36d89a
commit 781eba6df5
  1. 459
      src/mididevice.cpp
  2. 6
      src/performance.ini
  3. 187
      src/uimenu.cpp
  4. BIN
      wiki-update/Delay--Channel.png
  5. BIN
      wiki-update/mixing-console-overview.png

@ -29,7 +29,7 @@
#include <assert.h>
#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
@ -195,7 +199,7 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne
{
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)
{
@ -228,13 +233,13 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne
{
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;
@ -244,13 +249,13 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne
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:
@ -262,46 +267,46 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne
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:
@ -328,25 +333,25 @@ 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;
}
@ -354,24 +359,22 @@ void CMIDIDevice::MIDIMessageHandler(const u8 *pMessage, size_t nLength, unsigne
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<std::string, CMIDIDevice *>(pDeviceName, this));
s_DeviceMap.insert (std::pair<std::string, CMIDIDevice *> (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());
}
}

@ -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

@ -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}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 KiB

After

Width:  |  Height:  |  Size: 761 KiB

Loading…
Cancel
Save