Version 0.8.0

pull/1/head
asb2m10 10 years ago
parent a182f23eb8
commit 2681223566
  1. BIN
      Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate
  2. 5
      README.md
  3. 4
      Source/Dexed.h
  4. 28
      Source/GlobalEditor.cpp
  5. 47
      Source/OperatorEditor.cpp
  6. 2
      Source/OperatorEditor.h
  7. 12
      Source/PluginEditor.cpp
  8. 9
      Source/PluginProcessor.cpp
  9. 25
      Source/msfa/dx7note.cc
  10. 3
      Source/msfa/dx7note.h

@ -29,6 +29,7 @@ in normal operation it shouldn't crash and the VST state saving works. If you do
new version here but you see it in the change log, it's because this version is in development
(current sprint). Only officials (tested) builds are listed here.
* Version 0.8.0 [vst win32/x64](http://le-son666.com/software/dexed/dexed-0.8.0-win.zip) - [vst os x](http://le-son666.com/software/dexed/dexed-0.8.0-osx.vst.zip)
* Version 0.7.0 [vst win32/x64](http://le-son666.com/software/dexed/dexed-0.7.0-win.zip) - [vst os x](http://le-son666.com/software/dexed/dexed-0.7.0-osx.vst.zip)
* Version 0.6.1 [vst win32/x64](http://le-son666.com/software/dexed/dexed-0.6.1-win.zip) - [vst os x](http://le-son666.com/software/dexed/dexed-0.6.1-osx.vst.zip)
@ -36,7 +37,8 @@ Changelog
---------
#### Version 0.8.0
* New UI by [AZur Studio](http://bji.yukihotaru.com/)
* Fixed mono mode ticks on lower frequencies
* You can now copy/paste the operator/envelopes values by using the right-click mouse button on the operator
* Fixed some of mono mode ticks on lower frequencies
* SynprezFM preset are now in a submenu
#### Version 0.7.0
@ -150,6 +152,7 @@ TODO - Dexed
* UI threaded messaging to avoid DAW automation 'clicks'
* Zomby UI changes: this occurs in Live and will be fixed in the 0.8.1 version.
* Various code cleanup
* More smothness in mono mode
* AU Version
TODO - msfa

@ -24,14 +24,14 @@
void dexed_trace(const char *source, const char *fmt, ...);
#ifdef DEBUG
#define DEXED_VERSION "0.8.0b1 DEBUG"
#define DEXED_VERSION "0.8.0 DEBUG"
#ifdef _MSC_VER
#define TRACE(fmt, ...) dexed_trace(__FUNCTION__,fmt,##__VA_ARGS__)
#else
#define TRACE(fmt, ...) dexed_trace(__PRETTY_FUNCTION__,fmt,##__VA_ARGS__)
#endif
#else
#define DEXED_VERSION "0.8.0b1"
#define DEXED_VERSION "0.8.0"
#define TRACE(fmt, ...)
#endif

@ -318,7 +318,7 @@ void GlobalEditor::paint (Graphics& g)
Image myStrip = ImageCache::getFromMemory(BinaryData::Light_14x14_png, BinaryData::Light_14x14_pngSize);
g.drawImage(myStrip, 300, 70, 14, 14, 0, monoMode->getToggleState() ? 14 : 0, 14, 14);
g.drawImage(myStrip, 621, 102, 14, 14, 0, lfoSync->getToggleState() ? 14 : 0, 14, 14);
g.drawImage(myStrip, 619, 102, 14, 14, 0, lfoSync->getToggleState() ? 14 : 0, 14, 14);
g.drawImage(myStrip, 705, 102, 14, 14, 0, oscSync->getToggleState() ? 14 : 0, 14, 14);
//[/UserPaint]
}
@ -330,7 +330,7 @@ void GlobalEditor::resized()
lfoPitchDepth->setBounds (646, 50, 34, 34);
lfoDelay->setBounds (603, 50, 34, 34);
cutoff->setBounds (234, 9, 34, 34);
reso->setBounds (277, 9, 34, 34);
reso->setBounds (278, 9, 34, 34);
pitchRate2->setBounds (767, 96, 34, 34);
pitchRate3->setBounds (795, 96, 35, 34);
pitchRate4->setBounds (823, 96, 34, 34);
@ -342,7 +342,7 @@ void GlobalEditor::resized()
transpose->setBounds (202, 60, 34, 34);
oscSync->setBounds (650, 96, 48, 26);
pitchModSens->setBounds (666, 5, 34, 34);
lfoSync->setBounds (567, 96, 48, 26);
lfoSync->setBounds (565, 96, 48, 26);
pitchEnvDisplay->setBounds (751, 10, 93, 30);
algoDisplay->setBounds (335, 30, 152, 91);
feedback->setBounds (501, 81, 34, 34);
@ -350,15 +350,15 @@ void GlobalEditor::resized()
lcdDisplay->setBounds (6, 87, 140, 13);
output->setBounds (157, 60, 34, 34);
vuOutput->setBounds (6, 103, 140, 8);
initButton->setBounds (3, 53, 50, 30);
parmButton->setBounds (51, 53, 50, 30);
sendButton->setBounds (99, 53, 50, 30);
initButton->setBounds (3, 56, 50, 30);
parmButton->setBounds (51, 56, 50, 30);
sendButton->setBounds (99, 56, 50, 30);
cartButton->setBounds (3, 111, 50, 30);
loadButton->setBounds (50, 111, 50, 30);
saveButton->setBounds (98, 111, 50, 30);
storeButton->setBounds (270, 109, 50, 30);
monoMode->setBounds (249, 65, 48, 26);
lfoType->setBounds (584, 8, 36, 26);
lfoType->setBounds (583, 8, 36, 26);
programSelector->setBounds (153, 115, 112, 18);
//[UserResized] Add your own custom resize handling here..
//[/UserResized]
@ -613,7 +613,7 @@ void GlobalEditor::updateVu(float f) {
}
void GlobalEditor::setMonoState(bool state) {
monoMode->setState(state ? Button::ButtonState::buttonDown : Button::ButtonState::buttonNormal);
monoMode->setToggleState(state ? Button::ButtonState::buttonDown : Button::ButtonState::buttonNormal, dontSendNotification);
}
//[/MiscUserCode]
@ -656,7 +656,7 @@ BEGIN_JUCER_METADATA
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="0"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="reso" id="c8c13464e81a8d83" memberName="reso" virtualName=""
explicitFocusOrder="0" pos="277 9 34 34" min="0" max="1" int="0"
explicitFocusOrder="0" pos="278 9 34 34" min="0" max="1" int="0"
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="0"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="pitchRate2" id="73f386b3c91d3de4" memberName="pitchRate2"
@ -703,7 +703,7 @@ BEGIN_JUCER_METADATA
max="7" int="1" style="RotaryVerticalDrag" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<TOGGLEBUTTON name="lfoSync" id="ff92bb0a5a4f7187" memberName="lfoSync" virtualName=""
explicitFocusOrder="0" pos="567 96 48 26" buttonText="" connectedEdges="0"
explicitFocusOrder="0" pos="565 96 48 26" buttonText="" connectedEdges="0"
needsCallback="1" radioGroupId="0" state="0"/>
<GENERICCOMPONENT name="pitchEnvDisplay" id="9ddaae8ef924a038" memberName="pitchEnvDisplay"
virtualName="" explicitFocusOrder="0" pos="751 10 93 30" class="PitchEnvDisplay"
@ -729,13 +729,13 @@ BEGIN_JUCER_METADATA
<GENERICCOMPONENT name="vuOutput" id="dac75af912267f51" memberName="vuOutput" virtualName=""
explicitFocusOrder="0" pos="6 103 140 8" class="VuMeter" params=""/>
<TEXTBUTTON name="initButton" id="92b278163c42e21d" memberName="initButton"
virtualName="" explicitFocusOrder="0" pos="3 53 50 30" buttonText="INIT"
virtualName="" explicitFocusOrder="0" pos="3 56 50 30" buttonText="INIT"
connectedEdges="0" needsCallback="1" radioGroupId="0"/>
<TEXTBUTTON name="parmButton" id="d5cd6260b34be817" memberName="parmButton"
virtualName="" explicitFocusOrder="0" pos="51 53 50 30" buttonText="PARM"
virtualName="" explicitFocusOrder="0" pos="51 56 50 30" buttonText="PARM"
connectedEdges="0" needsCallback="1" radioGroupId="0"/>
<TEXTBUTTON name="sendButton" id="9b45b291c75c7b3f" memberName="sendButton"
virtualName="" explicitFocusOrder="0" pos="99 53 50 30" buttonText="SEND"
virtualName="" explicitFocusOrder="0" pos="99 56 50 30" buttonText="SEND"
connectedEdges="0" needsCallback="1" radioGroupId="0"/>
<TEXTBUTTON name="cartButton" id="465a101c3a0e744" memberName="cartButton"
virtualName="" explicitFocusOrder="0" pos="3 111 50 30" buttonText="CART"
@ -753,7 +753,7 @@ BEGIN_JUCER_METADATA
explicitFocusOrder="0" pos="249 65 48 26" buttonText="" connectedEdges="0"
needsCallback="1" radioGroupId="0" state="0"/>
<GENERICCOMPONENT name="lfoType" id="62f61dda9f76c8f" memberName="lfoType" virtualName=""
explicitFocusOrder="0" pos="584 8 36 26" class="ComboBoxImage"
explicitFocusOrder="0" pos="583 8 36 26" class="ComboBoxImage"
params=""/>
<GENERICCOMPONENT name="programSelector" id="990bbcccae72dbe6" memberName="programSelector"
virtualName="" explicitFocusOrder="0" pos="153 115 112 18" class="ProgramSelector"

@ -244,7 +244,7 @@ void OperatorEditor::paint (Graphics& g)
//[UserPaint] Add your own custom painting code here..
g.setColour (Colours::white);
g.setFont(Font (30.00f, Font::plain));
g.drawText(opNum, 242, 10, 30, 30, Justification::centred, true);
g.drawText(opNum, 242, 8, 30, 30, Justification::centred, true);
Image myStrip = ImageCache::getFromMemory(BinaryData::Light_14x14_png, BinaryData::Light_14x14_pngSize);
@ -253,7 +253,7 @@ void OperatorEditor::paint (Graphics& g)
// 129 x 24
g.drawImage(myStrip, 127, 24, 14, 14, 0, state ? 0 : 14, 14, 14);
// 199 x 24
g.drawImage(myStrip, 199, 24, 14, 14, 0, !state ? 0 : 14, 14, 14);
g.drawImage(myStrip, 198, 24, 14, 14, 0, !state ? 0 : 14, 14, 14);
//[/UserPaint]
}
@ -268,9 +268,9 @@ void OperatorEditor::resized()
s_egv2->setBounds (33, 169, 34, 34);
s_egv3->setBounds (61, 169, 34, 34);
s_egv4->setBounds (89, 169, 34, 34);
opLevel->setBounds (244, 74, 34, 34);
opLevel->setBounds (245, 76, 34, 34);
opFine->setBounds (78, 24, 34, 34);
opCoarse->setBounds (41, 24, 34, 34);
opCoarse->setBounds (43, 24, 34, 34);
khzDisplay->setBounds (15, 10, 95, 10);
detune->setBounds (6, 24, 34, 34);
envDisplay->setBounds (16, 83, 94, 30);
@ -278,12 +278,12 @@ void OperatorEditor::resized()
sclRightLevel->setBounds (241, 115, 34, 34);
sclLvlBrkPt->setBounds (178, 130, 54, 24);
sclRateScaling->setBounds (186, 179, 34, 34);
keyVelSens->setBounds (204, 74, 34, 34);
ampModSens->setBounds (141, 75, 34, 34);
keyVelSens->setBounds (204, 76, 34, 34);
ampModSens->setBounds (140, 76, 34, 34);
vu->setBounds (132, 52, 140, 8);
opMode->setBounds (147, 19, 48, 26);
kbdLeftCurve->setBounds (129, 170, 36, 26);
kbdRightCurve->setBounds (241, 170, 36, 26);
opMode->setBounds (146, 19, 48, 26);
kbdLeftCurve->setBounds (128, 170, 36, 26);
kbdRightCurve->setBounds (240, 170, 36, 26);
//[UserResized] Add your own custom resize handling here..
//[/UserResized]
}
@ -444,7 +444,7 @@ void OperatorEditor::bind(DexedAudioProcessor *parent, int op) {
int offset = parent->opCtrl[op].egRate[0]->getOffset();
envDisplay->pvalues = &(parent->data[offset]);
processor = parent;
opNum << op + 1;
internalOp = 5-op;
}
@ -489,16 +489,16 @@ void OperatorEditor::updateEnvPos(char pos) {
void OperatorEditor::mouseDown(const MouseEvent &event) {
if ( event.mods.isRightButtonDown() ) {
PopupMenu popup;
popup.addItem(1, "Copy Operator Values");
popup.addItem(2, "Paste Enveloppes Values", processor->hasClipboardContent());
popup.addItem(2, "Paste Enveloppe Values", processor->hasClipboardContent());
popup.addItem(3, "Paste Operator Values", processor->hasClipboardContent());
switch(popup.show()) {
case 1:
processor->copyToClipboard(internalOp);
break;
case 2:
processor->pasteEnvFromClipboard(internalOp);
break;
@ -507,7 +507,7 @@ void OperatorEditor::mouseDown(const MouseEvent &event) {
processor->pasteOpFromClipboard(internalOp);
break;
}
}
}
@ -564,7 +564,7 @@ BEGIN_JUCER_METADATA
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="opLevel" id="f8521c8214fb8993" memberName="opLevel" virtualName=""
explicitFocusOrder="0" pos="244 74 34 34" min="0" max="99" int="1"
explicitFocusOrder="0" pos="245 76 34 34" min="0" max="99" int="1"
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="opFine" id="e445aa61bd6cddcb" memberName="opFine" virtualName=""
@ -572,14 +572,15 @@ BEGIN_JUCER_METADATA
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="opCoarse" id="4eec63d30d7488d2" memberName="opCoarse" virtualName=""
explicitFocusOrder="0" pos="41 24 34 34" min="0" max="31" int="1"
explicitFocusOrder="0" pos="43 24 34 34" min="0" max="31" int="1"
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<LABEL name="khz" id="eb961eed8902a6fc" memberName="khzDisplay" virtualName=""
explicitFocusOrder="0" pos="15 10 95 10" bkgCol="6a000000" textCol="ffffffff"
outlineCol="0" edTextCol="ff000000" edBkgCol="0" labelText="1,000 kHz"
editableSingleClick="0" editableDoubleClick="0" focusDiscardsChanges="0"
fontname="Default font" fontsize="12.6" bold="0" italic="0" justification="36"/>
fontname="Default font" fontsize="12.599999999999999645" bold="0"
italic="0" justification="36"/>
<SLIDER name="detune" id="f093ec8defca2fc2" memberName="detune" virtualName=""
explicitFocusOrder="0" pos="6 24 34 34" min="-7" max="7" int="1"
style="RotaryVerticalDrag" textBoxPos="NoTextBox" textBoxEditable="0"
@ -604,23 +605,23 @@ BEGIN_JUCER_METADATA
min="0" max="7" int="1" style="RotaryVerticalDrag" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="keyVelSens" id="21795d045d07602b" memberName="keyVelSens"
virtualName="" explicitFocusOrder="0" pos="204 74 34 34" min="0"
virtualName="" explicitFocusOrder="0" pos="204 76 34 34" min="0"
max="7" int="1" style="RotaryVerticalDrag" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="ampModSens" id="634ceaa7b0f81a6c" memberName="ampModSens"
virtualName="" explicitFocusOrder="0" pos="141 75 34 34" min="0"
virtualName="" explicitFocusOrder="0" pos="140 76 34 34" min="0"
max="3" int="1" style="RotaryVerticalDrag" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<GENERICCOMPONENT name="vu" id="6f952594ea99dc1e" memberName="vu" virtualName=""
explicitFocusOrder="0" pos="132 52 140 8" class="VuMeter" params=""/>
<TOGGLEBUTTON name="opMode" id="15db8e5c9dd13966" memberName="opMode" virtualName=""
explicitFocusOrder="0" pos="147 19 48 26" buttonText="" connectedEdges="0"
explicitFocusOrder="0" pos="146 19 48 26" buttonText="" connectedEdges="0"
needsCallback="1" radioGroupId="0" state="0"/>
<GENERICCOMPONENT name="kbdLeftCurve" id="ee4e60dfcd6cb790" memberName="kbdLeftCurve"
virtualName="" explicitFocusOrder="0" pos="129 170 36 26" class="ComboBoxImage"
virtualName="" explicitFocusOrder="0" pos="128 170 36 26" class="ComboBoxImage"
params=""/>
<GENERICCOMPONENT name="kbdRightCurve" id="f5ca44d67593488a" memberName="kbdRightCurve"
virtualName="" explicitFocusOrder="0" pos="241 170 36 26" class="ComboBoxImage"
virtualName="" explicitFocusOrder="0" pos="240 170 36 26" class="ComboBoxImage"
params=""/>
</JUCER_COMPONENT>

@ -70,7 +70,7 @@ private:
//[UserVariables] -- You can add your own custom variables in this section.
String opNum;
int internalOp;
DexedAudioProcessor *processor;
//[/UserVariables]

@ -64,7 +64,7 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
{
LookAndFeel::setDefaultLookAndFeel(&dx_lnf);
setSize (866, ownerFilter->showKeyboard ? 677 : 583);
setSize (866, ownerFilter->showKeyboard ? 674 : 581);
processor = ownerFilter;
@ -85,15 +85,15 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
operators[2].bind(processor, 2);
addAndMakeVisible(&(operators[3]));
operators[3].setBounds(2, 220, 287, 218);
operators[3].setBounds(2, 219, 287, 218);
operators[3].bind(processor, 3);
addAndMakeVisible(&(operators[4]));
operators[4].setBounds(290, 220, 287, 218);
operators[4].setBounds(290, 219, 287, 218);
operators[4].bind(processor, 4);
addAndMakeVisible(&(operators[5]));
operators[5].setBounds(578, 220, 287, 218);
operators[5].setBounds(578, 219, 287, 218);
operators[5].bind(processor, 5);
// add the midi keyboard component..
@ -102,10 +102,10 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
// The DX7 is a badass on the bass, keep it that way
midiKeyboard.setLowestVisibleKey(24);
midiKeyboard.setBounds(4, 583, getWidth() - 8, 90);
midiKeyboard.setBounds(4, 581, getWidth() - 8, 90);
addAndMakeVisible(&global);
global.setBounds(2,437,864,144);
global.setBounds(2,436,864,144);
global.bind(this);
sendPopup.addItem(1, "Send program to DX7");

@ -50,8 +50,8 @@ DexedAudioProcessor::DexedAudioProcessor() {
currentNote = -1;
vuSignal = 0;
monoMode = 0;
initCtrl();
setCurrentProgram(0);
sendSysexChange = true;
normalizeDxVelocity = false;
sysexComm.listener = this;
@ -73,6 +73,7 @@ DexedAudioProcessor::DexedAudioProcessor() {
for (int note = 0; note < MAX_ACTIVE_NOTES; ++note) {
voices[note].dx7_note = NULL;
}
setCurrentProgram(0);
nextMidi = NULL;
midiMsg = NULL;
@ -344,9 +345,10 @@ void DexedAudioProcessor::keydown(uint8_t pitch, uint8_t velo) {
if ( monoMode ) {
for(int i=0; i<MAX_ACTIVE_NOTES; i++) {
if ( voices[i].live ) {
// all keys are up, don't transfert anything
// all keys are up, only transfert signal
if ( ! voices[i].keydown ) {
voices[i].live = false;
voices[note].dx7_note->transferSignal(*voices[i].dx7_note);
break;
}
if ( voices[i].midi_note < pitch ) {
@ -407,6 +409,9 @@ void DexedAudioProcessor::panic() {
for(int i=0;i<MAX_ACTIVE_NOTES;i++) {
voices[i].keydown = false;
voices[i].live = false;
if ( voices[i].dx7_note != NULL ) {
voices[i].dx7_note->firstUse();
}
}
keyboardState.reset();
}

@ -132,6 +132,13 @@ static const uint32_t ampmodsenstab[] = {
0, 4342338, 7171437, 16777216
};
Dx7Note::Dx7Note() {
for(int op=0;op<6;op++) {
params_[op].phase = 0;
params_[op].gain_out = 0;
}
}
void Dx7Note::init(const char patch[156], int midinote, int velocity) {
int rates[4];
int levels[4];
@ -168,8 +175,8 @@ void Dx7Note::init(const char patch[156], int midinote, int velocity) {
int32_t freq = osc_freq(midinote, mode, coarse, fine, detune);
basepitch_[op] = freq;
// cout << op << " freq: " << freq << endl;
params_[op].phase = 0;
params_[op].gain_out = 0;
//params_[op].phase = 0;
//params_[op].gain_out = 0;
ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3];
}
for (int i = 0; i < 4; i++) {
@ -274,3 +281,17 @@ void Dx7Note::transferState(Dx7Note &src) {
}
}
void Dx7Note::transferSignal(Dx7Note &src) {
for (int i=0;i<6;i++) {
params_[i].gain_out = src.params_[i].gain_out;
params_[i].phase = src.params_[i].phase;
//params_[i].phase = 0;
}
}
void Dx7Note::firstUse() {
for (int i=0;i<6;i++) {
params_[i].gain_out = 0;
params_[i].phase = 0;
}
}

@ -35,6 +35,7 @@ struct VoiceStatus {
class Dx7Note {
public:
Dx7Note();
void init(const char patch[156], int midinote, int velocity);
// Note: this _adds_ to the buffer. Interesting question whether it's
@ -53,6 +54,8 @@ class Dx7Note {
void update(const char patch[156], int midinote);
void peekVoiceStatus(VoiceStatus &status);
void transferState(Dx7Note& src);
void transferSignal(Dx7Note &src);
void firstUse();
private:
Env env_[6];

Loading…
Cancel
Save