From 076863212596e8ce619dfed08cf2193e7264f836 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Thu, 26 Dec 2013 18:35:05 -0500 Subject: [PATCH] Fixed tab --- .../UserInterfaceState.xcuserstate | Bin 66292 -> 66252 bytes Source/DXLookNFeel.cpp | 48 ++-- Source/DXLookNFeel.h | 14 +- Source/PluginEditor.cpp | 80 +++---- Source/PluginParam.cpp | 216 +++++++++--------- Source/PluginProcessor.cpp | 44 ++-- 6 files changed, 206 insertions(+), 196 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 5b570fd5d4d168b14a3f731762e8cf989dcf4668..6f095f41442a1a92729b5bdcf7fab5f279d5b2d7 100644 GIT binary patch delta 31050 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%0AG^Z+Og(YWo&hI%7avtS8$$6gZnH!cH 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 V@xQC`%$fhIUEBZq|2uy3{{W^sSA_ro diff --git a/Source/DXLookNFeel.cpp b/Source/DXLookNFeel.cpp index f7557b9..a815eda 100644 --- a/Source/DXLookNFeel.cpp +++ b/Source/DXLookNFeel.cpp @@ -22,31 +22,31 @@ #include "PluginProcessor.h" void EnvDisplay::paint(Graphics &g) { - int rate[4]; - int level[4]; + int rate[4]; + int level[4]; - for(int i=0;i<4;i++) { - rate[i] = s_rate[i]->getValue(); - level[i] = s_level[i]->getValue(); - } + for (int i = 0; i < 4; i++) { + rate[i] = s_rate[i]->getValue(); + level[i] = s_level[i]->getValue(); + } - env.init(rate, level, 99 << 5, 0); + env.init(rate, level, 99 << 5, 0); env.keydown(true); - for (int i=0;i<72;i++) { - int32_t pos = env.getsample(); - for(int j=0;j<16;j++) { - env.getsample(); - } - g.setPixel(i, 32 - (sqrt(pos) / 512)); - } + for (int i = 0; i < 72; i++) { + int32_t pos = env.getsample(); + for (int j = 0; j < 16; j++) { + env.getsample(); + } + g.setPixel(i, 32 - (sqrt(pos) / 512)); + } env.keydown(false); - for (int i=0;i<24;i++) { - int32_t pos = env.getsample(); - for(int j=0;j<16;j++) { - env.getsample(); - } - g.setPixel(i+72, 32 - (sqrt(pos) / 512)); - } + for (int i = 0; i < 24; i++) { + int32_t pos = env.getsample(); + for (int j = 0; j < 16; j++) { + env.getsample(); + } + g.setPixel(i + 72, 32 - (sqrt(pos) / 512)); + } } void AlgoDisplay::updateUI() { @@ -58,7 +58,7 @@ void AlgoDisplay::paint(Graphics &g) { } DXLookNFeel::DXLookNFeel() { - setColour(TextButton::buttonColourId,Colour(0xFF0FC00F)); - setColour(Slider::rotarySliderOutlineColourId,Colour(0xFF0FC00F)); - setColour(Slider::rotarySliderFillColourId,Colour(0xFFFFFFFF)); + setColour(TextButton::buttonColourId,Colour(0xFF0FC00F)); + setColour(Slider::rotarySliderOutlineColourId,Colour(0xFF0FC00F)); + setColour(Slider::rotarySliderFillColourId,Colour(0xFFFFFFFF)); } diff --git a/Source/DXLookNFeel.h b/Source/DXLookNFeel.h index 2ea1368..98a5bfc 100644 --- a/Source/DXLookNFeel.h +++ b/Source/DXLookNFeel.h @@ -25,19 +25,19 @@ #include "msfa/env.h" class EnvDisplay : public Component { - Env env; + Env env; public: - Slider *s_rate[4]; - Slider *s_level[4]; + Slider *s_rate[4]; + Slider *s_level[4]; - void paint(Graphics &g); + void paint(Graphics &g); }; class AlgoDisplay : public Component { - int algo; + int algo; public: - void paint(Graphics &g); - void updateUI(); + void paint(Graphics &g); + void updateUI(); }; class DXLookNFeel : public LookAndFeel_V3 { diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index fefaeb1..09f57c4 100755 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -129,45 +129,45 @@ void DexedAudioProcessorEditor::paint (Graphics& g) { void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { - if (buttonThatWasClicked == loadButton) { - FileChooser fc ("Import original DX sysex...", File::nonexistent, "*.syx;*.SYX", 1); - - if ( fc.browseForFileToOpen()) { - String f = fc.getResults().getReference(0).getFullPathName(); - uint8_t syx_data[4104]; - ifstream fp_in; - fp_in.open(f.toRawUTF8(), ifstream::in); - if (fp_in.fail()) { - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, - "Error", - "Unable to open: " + f); - return; - } - fp_in.read((char *)syx_data, 4104); - processor->importSysex((char *) &syx_data); - - presets.clear(NotificationType::dontSendNotification); - for(int i=0;igetNumPrograms();i++) { - String id; - id << (i+1) << ". " << processor->getProgramName(i); - presets.addItem(id, i+1); - } - - presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); - processor->setCurrentProgram(0); - processor->updateHostDisplay(); - } - - return; - } - - if (buttonThatWasClicked == aboutButton) { - AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator", "(c) 2013 Pascal Gauthier\nUnder the GPL v2" - "\nBased on Music Synthesizer for Android\n"); - return; - } - - AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Sorry", "Soon !"); + if (buttonThatWasClicked == loadButton) { + FileChooser fc ("Import original DX sysex...", File::nonexistent, "*.syx;*.SYX", 1); + + if ( fc.browseForFileToOpen()) { + String f = fc.getResults().getReference(0).getFullPathName(); + uint8_t syx_data[4104]; + ifstream fp_in; + fp_in.open(f.toRawUTF8(), ifstream::in); + if (fp_in.fail()) { + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + "Error", + "Unable to open: " + f); + return; + } + fp_in.read((char *)syx_data, 4104); + processor->importSysex((char *) &syx_data); + + presets.clear(NotificationType::dontSendNotification); + for(int i=0;igetNumPrograms();i++) { + String id; + id << (i+1) << ". " << processor->getProgramName(i); + presets.addItem(id, i+1); + } + + presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); + processor->setCurrentProgram(0); + processor->updateHostDisplay(); + } + + return; + } + + if (buttonThatWasClicked == aboutButton) { + AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator", "(c) 2013 Pascal Gauthier\nUnder the GPL v2" + "\nBased on Music Synthesizer for Android\n"); + return; + } + + AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Sorry", "Soon !"); } void DexedAudioProcessorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) { @@ -182,7 +182,7 @@ void DexedAudioProcessorEditor::timerCallback() { return; for(int i=0;i<6;i++) { - operators[i].updateGain(sqrt(env[5-i]) / 8196); + operators[i].updateGain(sqrt(env[5 - i]) / 8196); } } diff --git a/Source/PluginParam.cpp b/Source/PluginParam.cpp index 1aec12b..9ab8bad 100755 --- a/Source/PluginParam.cpp +++ b/Source/PluginParam.cpp @@ -49,27 +49,26 @@ void Ctrl::bind(ComboBox *c) { } void Ctrl::unbind() { - if ( slider != NULL ) { + if (slider != NULL) { slider->removeListener(this); slider = NULL; } - - if ( button != NULL ) { + + if (button != NULL) { button->removeListener(this); button = NULL; } - - if ( comboBox != NULL ) { + + if (comboBox != NULL) { comboBox->removeListener(this); comboBox = NULL; } } - // ************************************************************************ // CtrlInt ================================================================ CtrlDX::CtrlDX(String name, int steps, int offset, bool starts1) : -Ctrl(name) { + Ctrl(name) { add1 = starts1 == 1; this->steps = steps; value = 0; @@ -85,19 +84,19 @@ void CtrlDX::setValuePlugin(float f) { } void CtrlDX::setValue(int v) { - if ( v >= steps ) { + if (v >= steps) { TRACE("WARNING: value too big %s : %d", label.toRawUTF8(), v); - v = steps-1; + v = steps - 1; } value = v; - if ( dxOffset >= 0 ) { - if ( parent != NULL ) + if (dxOffset >= 0) { + if (parent != NULL) parent->setDxValue(dxOffset, v); } } int CtrlDX::getValue() { - if ( dxOffset >= 0 ) + if (dxOffset >= 0) value = parent->data[dxOffset]; return value; } @@ -110,39 +109,42 @@ String CtrlDX::getValueDisplay() { void CtrlDX::publishValue(int value) { parent->beginParameterChangeGesture(idx); - parent->setParameterNotifyingHost(idx, (((float)value) / steps)); + parent->setParameterNotifyingHost(idx, (((float) value) / steps)); parent->endParameterChangeGesture(idx); } void CtrlDX::sliderValueChanged(Slider* moved) { - publishValue(((int)moved->getValue() - add1)); + publishValue(((int) moved->getValue() - add1)); } -void CtrlDX::buttonClicked (Button* clicked) { +void CtrlDX::buttonClicked(Button* clicked) { publishValue(clicked->getToggleStateValue() == 1 ? 1 : 0); } -void CtrlDX::comboBoxChanged (ComboBox* combo) { - publishValue(combo->getSelectedId()-1); +void CtrlDX::comboBoxChanged(ComboBox* combo) { + publishValue(combo->getSelectedId() - 1); } void CtrlDX::updateComponent() { //TRACE("setting for %s %d", label.toRawUTF8(), getValue()); - if ( slider != NULL ) { - slider->setValue(getValue() + add1, NotificationType::dontSendNotification); + if (slider != NULL) { + slider->setValue(getValue() + add1, + NotificationType::dontSendNotification); } - - if ( button != NULL ) { - if ( getValue() == 0 ) { - button->setToggleState(false, NotificationType::dontSendNotification); + + if (button != NULL) { + if (getValue() == 0) { + button->setToggleState(false, + NotificationType::dontSendNotification); } else { - button->setToggleState(true, NotificationType::dontSendNotification); + button->setToggleState(true, + NotificationType::dontSendNotification); } } - - if ( comboBox != NULL ) { + + if (comboBox != NULL) { int cvalue = getValue() + 1; - if ( comboBox->getNumItems() <= cvalue ) { + if (comboBox->getNumItems() <= cvalue) { cvalue = comboBox->getNumItems(); } comboBox->setSelectedId(cvalue, NotificationType::dontSendNotification); @@ -153,97 +155,101 @@ void CtrlDX::updateComponent() { // Patcher ================================================================ void DexedAudioProcessor::initCtrl() { importSysex(BinaryData::startup_syx); - + // fill operator values; - for(int i=0;i<6;i++) { + for (int i = 0; i < 6; i++) { //// In the Sysex, OP6 comes first, then OP5... //int opTarget = (5-i) * 21; int opTarget = i * 21; - int opVal = 5-i; + int opVal = 5 - i; String opName; - opName << "OP" << (opVal+1); - - for(int j=0;j<4;j++) { + opName << "OP" << (opVal + 1); + + for (int j = 0; j < 4; j++) { String opRate; - opRate << opName << "-EGR" << (j+1); - opCtrl[opVal].egRate[j] = new CtrlDX(opRate, 100, opTarget+j); + opRate << opName << "-EGR" << (j + 1); + opCtrl[opVal].egRate[j] = new CtrlDX(opRate, 100, opTarget + j); ctrl.add(opCtrl[opVal].egRate[j]); - + String opLevel; - opLevel << opName << "-EGL" << (j+1); - opCtrl[opVal].egLevel[j] = new CtrlDX(opLevel, 100, opTarget+j+4); + opLevel << opName << "-EGL" << (j + 1); + opCtrl[opVal].egLevel[j] = new CtrlDX(opLevel, 100, + opTarget + j + 4); ctrl.add(opCtrl[opVal].egLevel[j]); } String opVol; opVol << opName << "-LEVEL"; - opCtrl[opVal].level = new CtrlDX(opVol, 100, opTarget+16); + opCtrl[opVal].level = new CtrlDX(opVol, 100, opTarget + 16); ctrl.add(opCtrl[opVal].level); - + String opMode; opMode << opName << "-MODE"; - opCtrl[opVal].opMode = new CtrlDX(opMode, 1, opTarget+17); + opCtrl[opVal].opMode = new CtrlDX(opMode, 1, opTarget + 17); ctrl.add(opCtrl[opVal].opMode); - + String coarse; coarse << opName << "-COARSE"; - opCtrl[opVal].coarse = new CtrlDX(coarse, 32, opTarget+18); + opCtrl[opVal].coarse = new CtrlDX(coarse, 32, opTarget + 18); ctrl.add(opCtrl[opVal].coarse); - + String fine; fine << opName << "-FINE"; - opCtrl[opVal].fine = new CtrlDX(fine, 100, opTarget+19); + opCtrl[opVal].fine = new CtrlDX(fine, 100, opTarget + 19); ctrl.add(opCtrl[opVal].fine); String detune; detune << opName << "-DETUNE"; - opCtrl[opVal].detune = new CtrlDX(detune, 15, opTarget+20); + opCtrl[opVal].detune = new CtrlDX(detune, 15, opTarget + 20); ctrl.add(opCtrl[opVal].detune); String sclBrkPt; sclBrkPt << opName << "-SCL_BRK_PNT"; - opCtrl[opVal].sclBrkPt = new CtrlDX(sclBrkPt, 100, opTarget+8); + opCtrl[opVal].sclBrkPt = new CtrlDX(sclBrkPt, 100, opTarget + 8); ctrl.add(opCtrl[opVal].sclBrkPt); String sclLeftDepth; sclLeftDepth << opName << "-SCL_LFT_DEPTH"; - opCtrl[opVal].sclLeftDepth = new CtrlDX(sclLeftDepth, 100, opTarget+9); + opCtrl[opVal].sclLeftDepth = new CtrlDX(sclLeftDepth, 100, + opTarget + 9); ctrl.add(opCtrl[opVal].sclLeftDepth); String sclRightDepth; sclRightDepth << opName << "-SCL_RHT_DEPTH"; - opCtrl[opVal].sclRightDepth = new CtrlDX(sclRightDepth, 100, opTarget+10); + opCtrl[opVal].sclRightDepth = new CtrlDX(sclRightDepth, 100, + opTarget + 10); ctrl.add(opCtrl[opVal].sclRightDepth); String sclLeftCurve; sclLeftCurve << opName << "-SCL_LFT_CURVE"; - opCtrl[opVal].sclLeftCurve = new CtrlDX(sclLeftCurve, 4, opTarget+11); + opCtrl[opVal].sclLeftCurve = new CtrlDX(sclLeftCurve, 4, opTarget + 11); ctrl.add(opCtrl[opVal].sclLeftCurve); String sclRightCurve; sclRightCurve << opName << "-SCL_RHT_CURVE"; - opCtrl[opVal].sclRightCurve = new CtrlDX(sclRightCurve, 4, opTarget+12); + opCtrl[opVal].sclRightCurve = new CtrlDX(sclRightCurve, 4, + opTarget + 12); ctrl.add(opCtrl[opVal].sclRightCurve); String sclRate; sclRate << opName << "-SCL_RATE"; - opCtrl[opVal].sclRate = new CtrlDX(sclRate, 7, opTarget+13); + opCtrl[opVal].sclRate = new CtrlDX(sclRate, 7, opTarget + 13); ctrl.add(opCtrl[opVal].sclRate); String ampModSens; ampModSens << opName << "-AMP_MODSENS"; - opCtrl[opVal].ampModSens = new CtrlDX(ampModSens, 3, opTarget+14); + opCtrl[opVal].ampModSens = new CtrlDX(ampModSens, 3, opTarget + 14); ctrl.add(opCtrl[opVal].ampModSens); String velModSens; velModSens << opName << "-VEL_MODSENS"; - opCtrl[opVal].velModSens = new CtrlDX(velModSens, 8, opTarget+15); + opCtrl[opVal].velModSens = new CtrlDX(velModSens, 8, opTarget + 15); ctrl.add(opCtrl[opVal].velModSens); } - + algo = new CtrlDX("Algorithm", 32, 134, true); ctrl.add(algo); - lfoRate = new CtrlDX("LFO-Rate", 100, 137); + lfoRate = new CtrlDX("LFO-Rate", 100, 137); ctrl.add(lfoRate); lfoDelay = new CtrlDX("LFO-Delay", 100, 138); @@ -260,27 +266,34 @@ void DexedAudioProcessor::initCtrl() { lfoWaveform = new CtrlDX("LFO-Waveform", 5, 142); ctrl.add(lfoWaveform); - - for(int i=0;iidx = i; ctrl[i]->parent = this; } } int DexedAudioProcessor::importSysex(const char *imported) { - memcpy(sysex, imported+6, 4104); - for(int i=0;i<32;i++) { - memcpy(patchNames[i], sysex + ((i*128)+118), 11); - - for(int j=0;j<10;j++) { - char c = (unsigned char)patchNames[i][j]; + memcpy(sysex, imported + 6, 4104); + for (int i = 0; i < 32; i++) { + memcpy(patchNames[i], sysex + ((i * 128) + 118), 11); + + for (int j = 0; j < 10; j++) { + char c = (unsigned char) patchNames[i][j]; switch (c) { - case 92: c = 'Y'; break; /* yen */ - case 126: c = '>'; break; /* >> */ - case 127: c = '<'; break; /* << */ + case 92: + c = 'Y'; + break; /* yen */ + case 126: + c = '>'; + break; /* >> */ + case 127: + c = '<'; + break; /* << */ default: - if (c < 32 || c > 127) c = 32; - break; + if (c < 32 || c > 127) + c = 32; + break; } patchNames[i][j] = c; } @@ -291,7 +304,7 @@ int DexedAudioProcessor::importSysex(const char *imported) { void DexedAudioProcessor::unpackProgram(int idx) { char *bulk = sysex + (idx * 128); - + for (int op = 0; op < 6; op++) { // eg rate and level, brk pt, depth, scaling memcpy(data + op * 21, bulk + op * 17, 11); @@ -308,7 +321,7 @@ void DexedAudioProcessor::unpackProgram(int idx) { data[op * 21 + 17] = fcoarse_mode & 1; data[op * 21 + 18] = fcoarse_mode >> 1; data[op * 21 + 19] = bulk[op * 17 + 16]; // fine freq - data[op * 21 + 20] = detune_rs >> 3; + data[op * 21 + 20] = detune_rs >> 3; } memcpy(data + 126, bulk + 102, 9); // pitch env, algo char oks_fb = bulk[111]; @@ -328,7 +341,6 @@ void DexedAudioProcessor::unpackProgram(int idx) { data[160] = 1; } - void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) { } @@ -336,18 +348,18 @@ void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) { void DexedAudioProcessor::setDxValue(int offset, int v) { TRACE("setting dx %d %d", offset, v); refreshVoice = true; - if ( offset >= 0 ) + if (offset >= 0) data[offset] = v; - if ( !sendSysexChange ) - return; - uint8 msg[7] = { 0xF0, 0x43, 0x10, offset > 127, 0, (uint8) v, 0xF7 }; + if (!sendSysexChange) + return; + uint8 msg[7] = { 0xF0, 0x43, 0x10, offset > 127, 0, (uint8) v, 0xF7 }; msg[4] = offset & 0x7F; - midiOut.addEvent(msg, 7, 0); + midiOut.addEvent(msg, 7, 0); } void DexedAudioProcessor::unbindUI() { - for(int i=0;iunbind(); } } @@ -357,11 +369,11 @@ int DexedAudioProcessor::getNumParameters() { return ctrl.size(); } -float DexedAudioProcessor::getParameter (int index) { +float DexedAudioProcessor::getParameter(int index) { return ctrl[index]->getValuePlugin(); } -void DexedAudioProcessor::setParameter (int index, float newValue) { +void DexedAudioProcessor::setParameter(int index, float newValue) { ctrl[index]->setValuePlugin(newValue); } @@ -373,15 +385,15 @@ int DexedAudioProcessor::getCurrentProgram() { return currentProgram; } -void DexedAudioProcessor::setCurrentProgram (int index) { +void DexedAudioProcessor::setCurrentProgram(int index) { /*// VST has a naughty problem of calling setCurrentProgram after a host has loaded - // an edited preset. We ignore the 16th value, since we want to keep the user values - if ( index == 32 ) { - return; - }*/ + // an edited preset. We ignore the 16th value, since we want to keep the user values + if ( index == 32 ) { + return; + }*/ - for(int i=0;i= 32 ) +const String DexedAudioProcessor::getProgramName(int index) { + if (index >= 32) index = 31; return String(patchNames[index]); } -void DexedAudioProcessor::changeProgramName (int index, const String& newName) { +void DexedAudioProcessor::changeProgramName(int index, const String& newName) { } - -const String DexedAudioProcessor::getParameterName (int index) { +const String DexedAudioProcessor::getParameterName(int index) { return ctrl[index]->label; } -const String DexedAudioProcessor::getParameterText (int index) { +const String DexedAudioProcessor::getParameterText(int index) { return ctrl[index]->getValueDisplay(); } //============================================================================== -void DexedAudioProcessor::getStateInformation (MemoryBlock& destData) { +void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) { // You should use this method to store your parameters in the memory block. // You could do that either as raw data, or use the XML or ValueTree classes // as intermediaries to make it easy to save and load complex data.*/ destData.insert(data, 161, 0); } -void DexedAudioProcessor::setStateInformation (const void* source, int sizeInBytes) { +void DexedAudioProcessor::setStateInformation(const void* source, + int sizeInBytes) { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. - memcpy((void *)data, source, sizeInBytes); + memcpy((void *) data, source, sizeInBytes); updateUI(); } - //============================================================================== -void DexedAudioProcessor::getCurrentProgramStateInformation (MemoryBlock& destData) { +void DexedAudioProcessor::getCurrentProgramStateInformation( + MemoryBlock& destData) { destData.insert(data, 161, 0); } -void DexedAudioProcessor::setCurrentProgramStateInformation (const void* source, int sizeInBytes) { - memcpy((void *)data, source, sizeInBytes); +void DexedAudioProcessor::setCurrentProgramStateInformation(const void* source, + int sizeInBytes) { + memcpy((void *) data, source, sizeInBytes); updateUI(); } - - - diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 70a82d9..fa405ae 100755 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -146,7 +146,7 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi } if ( ! midiOut.isEmpty() ) { - midiMessages.swapWith(midiOut); + midiMessages.swapWith(midiOut); } } @@ -158,28 +158,28 @@ AudioProcessor* JUCE_CALLTYPE createPluginFilter() { } void DexedAudioProcessor::processMidiMessage(MidiMessage *msg) { - if ( msg->isSysEx() ) { + if ( msg->isSysEx() ) { TRACE("SYSEX RECEIVED"); - const uint8 *buf = msg->getSysExData(); - int sz = msg->getSysExDataSize(); - if ( sz < 3 ) - return; - - // test if it is a Yamaha Sysex - if ( buf[0] != 0x43 ) - return; - - // single voice dump - if ( buf[2] == 0 ) { - if ( sz < 155 ) { - TRACE("wrong single voice datasize %d", buf[2]); - return; - } - updateProgramFromSysex(buf+5); - } - - return; - } + const uint8 *buf = msg->getSysExData(); + int sz = msg->getSysExDataSize(); + if ( sz < 3 ) + return; + + // test if it is a Yamaha Sysex + if ( buf[0] != 0x43 ) + return; + + // single voice dump + if ( buf[2] == 0 ) { + if ( sz < 155 ) { + TRACE("wrong single voice datasize %d", buf[2]); + return; + } + updateProgramFromSysex(buf+5); + } + + return; + } const uint8 *buf = msg->getRawData(); uint8_t cmd = buf[0];