[linux-audio-dev] Some comments on zynaddsubfx

Frank Neumann Frank.Neumann at st.com
Thu Sep 26 05:08:01 UTC 2002

Hi Nasca,

yesterday I tried your first version of ZynAddSubFX on my PC at home,
and though I was not able to use it successfully yet, I'd like to give
some feedback -

First, some info: My system is running Debian, with recent ALSA
(0.9.0rc3), recent FLTK (1.1.0rc1) and kernel 2.4.17. FFTW is 2.1.3.

Compiling ZynAddSubFX, I found that it tries to include "drfftw.h" in
DSP/FFTwrapper.h. I don't have this file, but reading into the FFTW
source and looking at my Debian packages, I saw there are version for
single precision and double precision, and though the FFTW source
package recommends to call the include files for the double precision
version "drfftw.h", it is actually only named "rfftw.h". Ok, so I
changed that and compilation went on a lot further.

Later on, another compiler error:

make[1]: Entering directory `/u1/src/zyn/ZynAddSubFX-1.0.0/src/Synth'
gcc -O6   -c -o ADnote.o ADnote.C
gcc -O6   -c -o Envelope.o Envelope.C
gcc -O6   -c -o LFO.o LFO.C
gcc -O6   -c -o OscilGen.o OscilGen.C
In file included from OscilGen.C:29:
../DSP/FFTwrapper.C: In function `void FFTsmps2freqs(int, float *, float
../DSP/FFTwrapper.C:31: passing `float *' as argument 2 of
`rfftw_one(fftw_plan_struct *, fftw_real *, fftw_real *)'
../DSP/FFTwrapper.C: In function `void FFTfreqs2smps(int, float *, float
../DSP/FFTwrapper.C:40: passing `float *' as argument 2 of
`rfftw_one(fftw_plan_struct *, fftw_real *, fftw_real *)'
make[1]: *** [OscilGen.o] Error 1
make[1]: Leaving directory `/u1/src/zyn/ZynAddSubFX-1.0.0/src/Synth'
make: *** [all] Error 2

Looking at DSP/FFTwrapper.C, I see you are using the type "REALTYPE *"
(with REALTYPE being defined in global.h as being float) for both
"freqs" and "smps". I changed that to the correct prototype, fftw_real
*, and now everything compiles and links.

However, when I runs the binary, as soon as I connect its ALSA port to
e.g. vkeybd and try to play it, it gives a segfault. I compile it with
-g -O to see where this happens, but the gdb output is rather useless
for me, probably due to the crash happening in another thread:

#0  0x40301730 in free () from /lib/libc.so.6
(gdb) bt
#0  0x40301730 in free () from /lib/libc.so.6
#1  0x403016d3 in free () from /lib/libc.so.6
#2  0x4011deec in fftw_free () from /usr/lib/libfftw.so.2
#3  0x00000010 in ?? ()
Error accessing memory address 0x6: No such process.

I hope this is not due to my "fix".

A similar crash happens whenever I try to load a master file:

(gdb) bt
#0  0x40301730 in free () from /lib/libc.so.6
#1  0x403016d3 in free () from /lib/libc.so.6
#2  0x4011deec in fftw_free () from /usr/lib/libfftw.so.2
#3  0x400ea6ac in rfftw_one () from /usr/lib/librfftw.so.2
#4  0x0805be93 in OscilGen::saveloadbuf ()
#5  0x08053adb in ADnoteParameters::saveloadbufvoice ()
#6  0x08054860 in ADnoteParameters::saveloadbuf ()
#7  0x080520a2 in Part::saveloadbuf ()
#8  0x080500a0 in Master::saveloadbuf ()
#9  0x080752d2 in MasterUI::cb_Open ()
#10 0x4016ad9a in Fl_Menu_::picked () from /usr/lib/libfltk.so.1.1
#11 0x4016b414 in Fl_Menu_Bar::handle () from /usr/lib/libfltk.so.1.1
#12 0x4015b22d in Fl_Group::find () from /usr/lib/libfltk.so.1.1
#13 0x4015b7cc in Fl_Group::handle () from /usr/lib/libfltk.so.1.1
#14 0x401483b2 in Fl_Window::handle () from /usr/lib/libfltk.so.1.1
#15 0x40147d09 in fl_throw_focus () from /usr/lib/libfltk.so.1.1
#16 0x40147e58 in Fl::handle () from /usr/lib/libfltk.so.1.1
#17 0x40186781 in fl_handle () from /usr/lib/libfltk.so.1.1
#18 0x401850aa in Fl::remove_fd () from /usr/lib/libfltk.so.1.1
#19 0x40185420 in fl_ready () from /usr/lib/libfltk.so.1.1
#20 0x40185321 in fl_wait () from /usr/lib/libfltk.so.1.1
#21 0x401475c9 in Fl::wait () from /usr/lib/libfltk.so.1.1
#22 0x40147657 in Fl::wait () from /usr/lib/libfltk.so.1.1
#23 0x080795f5 in thread3 ()
#24 0x403b3fa5 in pthread_start_thread () from /lib/libpthread.so.0

Oh, and I noticed the default filter mask in the file requester is wrong
- I always need to change this from (*.mas_zyn) to * to see the master

Any hints or suggestions are welcome. The demo files sound very
interesting, so I am eager to get this to run.


More information about the Linux-audio-dev mailing list