Element Green ---------- Forwarded message ---------- From: "element1green" <element1gr...@gmail.com> Date: Jan 2, 2016 11:33 AM Subject: Re: [fluid-dev] question on linear interpolation To: "FluidSynth mailing list" <fluid-dev@nongnu.org> Cc:
Use capital -O0 for the optimization. Element On Jan 2, 2016 10:58 AM, "Brad Stewart" <brads...@fastmail.us> wrote: > Yes, I am building the shell. Interestingly, it stores the executable in > a hidden directory <workspace>/fluidsynth/src/.libs > > The console window only displays the shell and I see no error messages. > I'll need to figure out how to display internal printf messages. > > I am having problems building a debug variant. I tried adding -g -o0 but > get many build errors. This might be due to the way Eclipse sets up > autotools. Any quick hints? > > --Brad > > > > On 01/02/2016 08:08 AM, Element Green wrote: > > Hello Brad, > > It sounds like you really need to get debugging working. From what you > said about the "interp num" command, I assume you are building the > fluidsynth command shell. Do you get any relevant error messages on the > console (probably the same terminal you are running fluidsynth from - but > may be hidden if you are accessing the shell through TCP for example). > Make sure you are able to see console messages, since there may be some > useful error messages getting output. > > When running the interp command it should > call fluid_synth_set_interp_method(). I would get debugging working and > set a breakpoint on that function and make sure it is doing all the calls > to fluid_channel_set_interp_method() for every channel. > > Best regards, > > Element > > On Sat, Jan 2, 2016 at 4:57 AM, Marcus Weseloh <mar...@weseloh.cc> wrote: > >> Hi Brad, >> >> Out of curiosity I checked that the interp setting actually had an >> effect by adding printf statements to the relevant functions. The >> fluid_rvoice_dsp_interpolate_linear function is called just fine if >> you set "interp 1" in the FluidSynth shell. Seems like you've got a >> problem with your devel setup... >> >> Cheers, >> >> Marcus >> >> 2016-01-02 0:33 GMT+01:00 Brad Stewart <brads...@fastmail.us>: >> > So I recompiled the code and added a return at the beginning of the >> function >> > fluid_rvoice_dsp_interpolate_linear (fluid_rvoice_dsp_t *voice). >> > >> > I also tried adding a for(;;) and a printf. >> > >> > I tried several interp num commands (with num from 0 to 7) but it seems >> it >> > never gets to this function. All audio sounds as it should. >> > >> > Could you comment please? >> > >> > Thanks, >> > Brad >> > >> > P.S. I imported the project into Eclipse Mars using import "existing >> tools >> > as Autotools project". It compiled with some warnings. It seems to >> run OK. >> > But I was unable to build a debug version of it so I could use gdb to >> trace >> > through the code. >> > >> > >> > >> > >> > >> > On 12/31/2015 03:36 PM, Brad Stewart wrote: >> > >> > Could you confirm that "interp 1" command line invokes the Linear >> > Interpolation function? >> > Thanks, >> > Brad >> > >> > >> > >> > On Thu, Dec 31, 2015, at 01:36 PM, Element Green wrote: >> > >> > Hello Brad, >> > >> > To my knowledge the audio sample data is used as is in FluidSynth. The >> > sample rate of the data and the current pitch of a voice determine how >> it >> > gets interpolated. So I believe your analysis is correct, that >> > interpolating between two identical values will yield that value with >> the >> > linear interpolation algorithm, regardless of where in between the two >> > points the new interpolated point lies. The higher order interpolation >> > algorithms will be affected by additional sample points though, so it >> would >> > not be true in those cases unless additional consecutive points had the >> same >> > value (for the number of points used by the interpolation algorithm). >> > >> > At this point I'm not sure what you are asking anymore though. >> > >> > Best regards, >> > >> > Element >> > >> > >> > On Thu, Dec 31, 2015 at 12:38 PM, Brad Stewart <brads...@fastmail.us> >> wrote: >> > >> > >> > Hi Mr Green, >> > >> > Yes, I am carrying the fractional part. In my case, it's 12 bits and I >> > shift right by 4 to get the upper 8 bits to index to the coefficient >> table. >> > >> > But let me cite an example, >> > Suppose I have x[i]=100 and x[i+1]=100 (which occurs often in a lower >> note >> > frequency). >> > >> > Assume after looking up the coefficient table, you get coeffs[0] = .3 >> and >> > coeffs[1] = .7 >> > So if you do the math, >> > out=100*.3 + 100*.7 = 100. So no change. >> > In my case, I can have 4 consecutive values of 100 (at note = 60) as >> shown >> > in the previous images. >> > >> > So any of the coefficients in the table will return a value and >> 1-value, if >> > the current sample and then next are the same, the output is always the >> > original value. So in the general case where sampe[i]=sample[i+1], >> > >> > out = sample* frac + sample*(1-frac) = sample*(frac +1 -frac) = sample = >> > out. >> > >> > This is why I was asking if you're adding to the data set by >> up-sampling, >> > pre-filtering, or something else. This is hinted at in the paper by >> Olli >> > Niemitalo. >> > I suppose you that the interpolated value could be stuffed back into the >> > original data (recursion) but I don't see that occurring in >> > fluid_voice_dsp.c. >> > >> > Brad >> > >> > >> > >> > >> > On Wed, Dec 30, 2015, at 07:21 PM, Element Green wrote: >> > >> > Hello Brad, >> > >> > >> > On Wed, Dec 30, 2015 at 7:42 PM, Brad Stewart <brads...@fastmail.us> >> wrote: >> > >> > Hi, >> > >> > I'm developing an embedded project using some of the code in FluidSynth. >> > >> > The target is an ARM Cortex M4 and am using integer math. Most of the >> > coefficients are in Q15 format. >> > >> > So far, I'm able to generate different notes with sound font files and >> use >> > some of the CMSIS DSP libraries to generate high order IIR filters. >> > >> > But I am having no luck with any interpolation routines. I ran some >> tests >> > using the command line version of FluidSynth on a laptop running Ubuntu >> 14. >> > >> > I created a sine wave sound font (using Swami) with a sample rate of >> 20050 >> > Hz, root note is 86. It's looping over several cycles. The image >> > Midi_60_no_interpolation.jpg picture shows the result with no >> interpolation >> > (I get the exact same results on my embedded platform). This is using >> > "interp 0". (Note that the ringing is due to the sinc function in the >> Codec >> > filter/decimator.) >> > >> > If I then set "interp 1", I get the image as shown in >> > Midi_60_linear_interpolation.jpg which is a major improvement. >> > >> > I have reviewed the code inside fluid_voice_dsp.c and have set up my >> program >> > to emulate the equations. I converted the floating point coefficients >> to >> > Q15 format. It seems to do exactly what it's supposed to do. Yet I >> see no >> > improvement what-so-ever except at higher note values. >> > >> > However...I don't see how linear interpolation can work. If you have >> > straight lines (i.e. the "steps" in the first waveform), a linear >> > interpolation won't change anything since the current sample and the >> next >> > sample are the same over several samples. >> > >> > Are you up-sampling before you to do the linear interpolation? I didn't >> see >> > any evidence in the code. Or do you simply take the loop sample as is >> and >> > step through it using dsp_phase_index? I don't think the bi-quad post >> > filter has an effect since it has a very high cut-off. Nor should the >> > reverb or chorus blocks have any effect (since they're disabled anyway >> in my >> > test). >> > >> > What am I missing? >> > >> > Thanks for your time and consideration. Any advice or insight is >> > appreciated. I really like FluidSynth. >> > >> > Brad Stewart >> > P.S. I also implemented the 4th order interpolation but it didn't >> change >> > anything--I still get the "stepped" waveform. (At 50MHz clock, the M4 >> can >> > process 128 samples in <1uS with sound fonts stored in internal Flash >> > memory. Pretty impressive.) >> > >> > >> > >> > >> > Let me make sure I understand your situation correctly.. So you have >> taken >> > the interpolation code in fluid_rvoice_dsp.c and adapted it to integer >> math >> > and there is something wrong with the ported code, since it is not >> > interpolating as expected. >> > >> > It has been a while since I delved into the interpolation code and I >> did not >> > originally write it (though I did muck about in that area a bit). If >> you >> > look at the fluid_rvoice_dsp_config() routine you will see that it >> > initializes the interpolation tables, including interp_coeff_linear, >> which >> > essentially stores 2 tables of linearly increasing and decreasing values >> > from 0 to 1. These values are then used depending on the current sample >> > index fraction (think of the current sample pointer as being at a >> position >> > which may be in between 2 consecutive samples - the fraction >> component). If >> > the fractional position is closer to the first sample, then it will >> have a >> > higher weight in the linear calculation of the sample value which gets >> > synthesized. I hope that makes sense and perhaps you already knew this >> - >> > seeing as you have done this port. >> > >> > I would make sure that your ported code retains this fractional sample >> > pointer component and is using it properly and that your linear >> coefficients >> > table is properly initialized. You should be able to see this stuff at >> work >> > by single stepping the code and looking at the calculations to see if >> they >> > are behaving as expected. >> > >> > Hope that helps. Maybe I did not get your scenario right though, if so, >> > please explain in more detail. >> > >> > Best regards, >> > >> > Element Green >> > >> > >> > _______________________________________________ >> > fluid-dev mailing list >> > fluid-dev@nongnu.org >> > https://lists.nongnu.org/mailman/listinfo/fluid-dev >> > >> > >> > -- >> > Brad Stewart >> > brads...@fastmail.us >> > >> > >> > >> > >> > _______________________________________________ >> > fluid-dev mailing list >> > fluid-dev@nongnu.org >> > https://lists.nongnu.org/mailman/listinfo/fluid-dev >> > >> > >> > >> > _______________________________________________ >> > fluid-dev mailing list >> > fluid-dev@nongnu.org >> > https://lists.nongnu.org/mailman/listinfo/fluid-dev >> > >> >> _______________________________________________ >> fluid-dev mailing list >> fluid-dev@nongnu.org >> https://lists.nongnu.org/mailman/listinfo/fluid-dev >> > > > > _______________________________________________ > fluid-dev mailing > listfluid-dev@nongnu.orghttps://lists.nongnu.org/mailman/listinfo/fluid-dev > > > > _______________________________________________ > fluid-dev mailing list > fluid-dev@nongnu.org > https://lists.nongnu.org/mailman/listinfo/fluid-dev > >
_______________________________________________ fluid-dev mailing list fluid-dev@nongnu.org https://lists.nongnu.org/mailman/listinfo/fluid-dev