Free FM Synthesizer Dexed (VST Windows and Mac)
-
- KVRer
- 22 posts since 9 Jan, 2008
The hardware thingy receives these parameters via Sysex. This is not intended for realtime. So it is likely that this suffers from the same problem that I described. (But maybe this is not what the OP meant by "continuous parameter update", anyway.)
-Michael
-Michael
- KVRist
- 150 posts since 20 Dec, 2013 from Montreal
Hit the CART button and from there use the right-click button on the program or the sysex file to send it to the DX7mschnell wrote:I did not find a send button here.
-Michael
I know, that issue was already signaled before... probably a integer cast issue that was in the original code. It is on my todo list, but not in the release I'm doing this week since I want to release it this week.Swiss Frank wrote:Hello again @asb2m10 ...
I noted that the LFO speed ranges have big jumps after parameter value 68, 74, and every six thereafter.
Is this a simulation of the actual hardware? Or just a result of your Lfo::reset() function that is a compromise that sounds good and was simple to program?
( BTW I have that question about most of the code in Dexed, ranging from feedback amounts to LFO delay and rate to keyboard scaling and envelopes etc. How much of that is exact matches for the DX, and how did you get that info? How much is just guesswork/sounds good enough? How much is just approximations to guesswork?)
BTW what is the "11" factor in Lfo::reset() for? I can't figure out what variable "sr" might be. If you wanted a smoother curve but didn't want to call fancy/slow math routines this might be a good case for a look-up table.
And for specific question about the rate scaling and envelopes, that's Raph Levien work and this is where I've taken the code in 2013 : https://github.com/google/music-synthesizer-for-android. I thought it sounded great and wanted to port it to a VST. The 'sr' variable stands for sample rate. And I don't think we can quantify approximations vs guesswork; his code and my parts is not in the final state and since we don't have to original source code, we can simply guess it and iterate it to make it better each time. It is my goal in the future (and have time) to make simulations on specific parts, but this is a very time consuming task.
As for the Sin::, the function you posted is never used. If you look closely at Sin.h, it defines SIN_INLINE that uses a different implementation (it uses the inline one directly in the header file). I think Raph left it there for experimenting and left the 64bit offset to be able to compare settings with bigger LUT.
Thanks for noticing, this is indeed useless in the loop.Swiss Frank wrote: It's not a big deal but I wonder if this pitchenv_keydown could be moved out of this loop.
The code is already there and it is not using the same sysex header value that the problem describe.mschnell wrote:The hardware thingy receives these parameters via Sysex. This is not intended for realtime. So it is likely that this suffers from the same problem that I described. (But maybe this is not what the OP meant by "continuous parameter update", anyway.)
uint8 msg[7] = { 0xF0, 0x43, 0x10, offset > 127, 0, (uint8) v, 0xF7 };
I don't have access to my DX7 right now, so I will have to guess why it doesn't work anymore.
-
- KVRAF
- 5510 posts since 6 May, 2002
This is the right interpretation. The point is to use Dexed the same way you would apply a BCR2000 to control a hardware synth's parameters. Also I would like to see a quick MIDI mute toggle switch to select between triggering Dexed's internal synth engine and triggering the hardware DX7 over the connected MIDI port. It would also be good to have MIDI learn for this toggle switch..jon wrote: He is asking for continuous output of Dexed parameters to a DX7, to control the hardware synth in real time.
So you're saying its technically possible but just too slow to update in realtime?mschnell wrote:The hardware thingy receives these parameters via Sysex. This is not intended for realtime. So it is likely that this suffers from the same problem that I described. (But maybe this is not what the OP meant by "continuous parameter update", anyway.)
-Michael
Intel Core2 Quad CPU + 4 GIG RAM
-
- KVRist
- 143 posts since 29 Aug, 2011
Hi Pascal,
You're of course right, I mentioned the sin.cc version, not the sin.h version.
However the sin.h version HAS THE SAME PROBLEM.
These (int64_t) casts are NOT NEEDED with a 10-bit lookup table.
These casts make the inline version 3.4x slower than it would be without the casts.
It looks like this sin.h inline lookup() is used by fm_op_kernel.cc for the operators. If so, a 3.4x speedup should make a notable difference in the total application speed.
Thanks for hearing me out on this and forgive me if I'm wrong, I've only looked at the code a few minutes.
You're of course right, I mentioned the sin.cc version, not the sin.h version.
However the sin.h version HAS THE SAME PROBLEM.
These (int64_t) casts are NOT NEEDED with a 10-bit lookup table.
These casts make the inline version 3.4x slower than it would be without the casts.
It looks like this sin.h inline lookup() is used by fm_op_kernel.cc for the operators. If so, a 3.4x speedup should make a notable difference in the total application speed.
Thanks for hearing me out on this and forgive me if I'm wrong, I've only looked at the code a few minutes.
-
- KVRer
- 22 posts since 9 Jan, 2008
Not too slow, but hopping in steps of (e.g.) 0..127. Doing this on (e.g.) an operator volume in realtime will create nasty artifacts. To be used (e.g.) with a wheel will need some smoothing on the synth site.electro wrote:So you're saying its technically possible but just too slow to update in realtime?
-Michael
- KVRist
- 150 posts since 20 Dec, 2013 from Montreal
Here is the beta for now...
it gets single click program change, master tune adj, op switch and multiple sysex file fix. Let me know if you find anything wrong with those builts.
Thanks.
http://le-son666.com/software/dexed/dex ... b1-osx.zip
http://le-son666.com/software/dexed/dex ... b1-win.zip
Thanks.
http://le-son666.com/software/dexed/dex ... b1-osx.zip
http://le-son666.com/software/dexed/dex ... b1-win.zip
-
- KVRist
- 55 posts since 27 Apr, 2004 from Andria (BT) - Italy
I want to test the Beta but there is a error on http://le-son666.com/software/dexed/dex ... b1-win.zip

Forbidden
You don't have permission to access /software/dexed/dexed-0.9.2b1-win.zip on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Byee from Italy
Forbidden
You don't have permission to access /software/dexed/dexed-0.9.2b1-win.zip on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Byee from Italy
Benis67 http://www.benis.it
- KVRAF
- 43920 posts since 11 Aug, 2008 from clown world
I had to right-click on the link and save-as in windows FireFox.benedettodue wrote:I want to test the Beta but there is a error on http://le-son666.com/software/dexed/dex ... b1-win.zip
Forbidden
You don't have permission to access /software/dexed/dexed-0.9.2b1-win.zip on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Byee from Italy
Anyone who can make you believe absurdities can make you commit atrocities.
-
- KVRist
- 55 posts since 27 Apr, 2004 from Andria (BT) - Italy
Ok but there is the same problem: the downloaded file is a text with the same message error!
Benis67 http://www.benis.it
-
- KVRist
- 143 posts since 29 Aug, 2011
Hey Pascal,
I forgot to mention: to switch the linear interpolation to 32-bit match, you have to move to an 11-bit lookup table. That makes dy and lowbits each one bit smaller. Add the sign bit and still only 31 bits needed. (With the 10-bit lookup they need 32 bits... plus a sign bit, so you have to use the 64-bit casts.)
I've tested A) empty loop, B) sin.h inline lookup() in the loop, and C) 11-bit lookup with no 64-bit casts.
For 1,000,000,000 iterations (about 16 seconds), the times were 2.02 sec, 10.75, and 4.56. B/C = 2.35x faster, but if you factor out the overhead of the loop, (B-A)/(C-A) is 3.45x faster.
See the attachment for a spectrum analysis of 1) your code. 2) your code switched to 11-bit table. 3) your code switched to 11-bit table PLUS 64-bit casts removed.
First, you should notice second and third graphs are pretty much the same. If the casts were actually needed you'd see huge noise here. Second, the improvement in fidelity is potentially compelling too, given that it doesn't seem to cause any performance issue.
I forgot to mention: to switch the linear interpolation to 32-bit match, you have to move to an 11-bit lookup table. That makes dy and lowbits each one bit smaller. Add the sign bit and still only 31 bits needed. (With the 10-bit lookup they need 32 bits... plus a sign bit, so you have to use the 64-bit casts.)
I've tested A) empty loop, B) sin.h inline lookup() in the loop, and C) 11-bit lookup with no 64-bit casts.
For 1,000,000,000 iterations (about 16 seconds), the times were 2.02 sec, 10.75, and 4.56. B/C = 2.35x faster, but if you factor out the overhead of the loop, (B-A)/(C-A) is 3.45x faster.
See the attachment for a spectrum analysis of 1) your code. 2) your code switched to 11-bit table. 3) your code switched to 11-bit table PLUS 64-bit casts removed.
First, you should notice second and third graphs are pretty much the same. If the casts were actually needed you'd see huge noise here. Second, the improvement in fidelity is potentially compelling too, given that it doesn't seem to cause any performance issue.
- KVRer
- 9 posts since 28 Jul, 2016
friendly cpu synth 
- KVRian
- 1209 posts since 28 Jun, 2005
One (of 2
) bugreport :
The readout of one of these is wrong :
Left 9.0 B2 Right 9.2 B1 (Coarse 8 fine 50 Fixed) EDIT: tested and the new one is the right value (but it looks ugly
) so it's NOT a bug.
The readout of one of these is wrong :
Left 9.0 B2 Right 9.2 B1 (Coarse 8 fine 50 Fixed) EDIT: tested and the new one is the right value (but it looks ugly
You do not have the required permissions to view the files attached to this post.
-
- KVRAF
- 5510 posts since 6 May, 2002
The MIDI Out Port cannot be accessed by Dexed and the DAW at the same time. This is why Dexed should be able to pass MIDI messages to the DX7 through the same port as .syx transmit.
Then add a toggle switch to switch between triggering the Dexed's internal synth and triggering the DX7.
Then add a toggle switch to switch between triggering the Dexed's internal synth and triggering the DX7.
Intel Core2 Quad CPU + 4 GIG RAM
