Page 1 of 2

just one thing bothering me ..

Posted: Mon Nov 20, 2017 11:28 am
by HughBanton
.. as Columbo used to say ;)

Can someone explain something to me .. ?

Attached is an fsm illustrating two methods or reading waves stored in an array. The top one I've used successfully in a project, and I was wondering yesterday if the bottom one would give the same result.

Needless to say for audio waves it doesn't, but I don't understand why not. I've used this exact arrangemnent elsewhere in the same project for extracting floats from arrays.

So I guess my question boils down to .. what exactly does the Array_to_Mem prim do to the numbers? What's the difference between a mem and a float_array and why is it needed for waves & samples?

Thanks in advance to Those Who Know These Things!

read_waves.fsm
(348 Bytes) Downloaded 1210 times

Re: just one thing bothering me ..

Posted: Mon Nov 20, 2017 5:30 pm
by Spogg
I used to love Columbo, because you didn’t have to guess who dunnit, with all that complicated yet formulaic detective crap you get in normal crime dramas. And nobody could beat Peter Falk in that role.

Anyway, I’m not sure about the answer, but I think it’s because once you convert an array into a memory block you can then use other prims etc. to process the contents of the mem. It becomes a sort of common currency for the schematic, without having loads of green. If you don’t need this then the Array to Poly may be adequate and possibly faster.

I now wait for confirmation/clarification from others…

Cheers

Spogg

Re: just one thing bothering me ..

Posted: Tue Nov 21, 2017 9:14 am
by martinvicanek
Differences:
- wave read will work in both poly and stream while float array to poly will only work in poly
- wave read can do stereo
- rounding seems to be different if you supply a fractional index
- also different behavior for index out of bounds
- float array to poly uses less CPU

Other than that they seem to be interchangeable (in poly).

Re: just one thing bothering me ..

Posted: Wed Nov 22, 2017 10:49 am
by HughBanton
Thanks Martin.

CPU% improvement is what I'm after (inspired by your very own 'organ-proof-of-concept', which leaves everything I've ever done standing!!)(Oh .. I'll get back to that project some time soon .. winter nights incoming. If people ever let me return to my semi-retirement. Whatever that is).

I tried a direct substitution (FA2P in place of Wave Read) the other day, in my HB3 project, but got waveshape errors that I couldn't track down, but if you say it should be possible I will certainly try again. Every 0.1% helps - I've had considerable success in recent days elsewhere in the schematic substituting Assem modules - then pruning them; improved the CPU efficiency by at least 25% so far. Eventually I might even understand what I'm doing :-)

Question .. Stereo. So is Wave Read using MS Wave format, with a header?? Do I assume then that Wave Read looks for a header and does stereo/mono accordingly? My own wave data is just a string of 72 (mono) waveforms, butted end-to-end in a Float Array, 1 wave for each keyboard note. Different lengths, but that's all taken care of and has worked fine using Wave Read. But screws up with FA2P substitution; gets worse up the keybaoard, which is doubtless a clue.

Grateful for any more insights!

Re: just one thing bothering me ..

Posted: Wed Nov 22, 2017 6:03 pm
by HughBanton
Possibly I have discovered another important difference between FA2P and Wave Read ..

I've had another go at the Wave Read >> FA2P substitution and concluded that the latter was only correctly playing waveforms from the bottom octave.

I then rigged up a test, and as far as I can tell FA2P will only read an array of maximum 2048 array entries. Who knew. Above that you get the array entry from address %2048 .. so presumably it's simply ignoring higher address bits.

My lower octave notes are all either 1024, 512, or 128 bytes in length each (depending on footage), so now all becomes clear.

In my quest for speed, Martin, would I gain from writing a dsp module with a memin input? I'm currently using a pair of Wave Reads with fractional interpolation (usual method), so I could incorporate that as well. Or would the pair of Wave Read prims perform as fast anyway?

Itza journey :shock:

Re: just one thing bothering me ..

Posted: Thu Nov 23, 2017 9:29 am
by Spogg
Just to clarify…

Did you configure two FA2Ps for interpolation and get tuning errors? In fact exactly what was the issue with the “readout”?
It may be that the FA2P was intended for slower readout. The manual rarely says stuff like that. Maybe the prim has to re-evaluate the array for each step.
I can see a use for this, for example reading out a modulation shape like a special envelope or LFO. Dunno.

Cheers

Spogg

Re: just one thing bothering me ..

Posted: Thu Nov 23, 2017 11:52 pm
by HughBanton
Hi Spogg,

No, as far as I can tell there's no problem with the speed of FA2P. (Martin states that FA2P uses less CPU than Wave Read, and can generally be subtituted). I did try configuring a pair of FA2Ps, interpolated, replacing my pair of Wave Reads, just as a simplification experiment.

But the problem was not tuning. Rather, I could see that I was only getting segments of my waves rather than the complete cycle - first 1/2 of it, 1/4 of it, 1/8 etc .. apart from in the bottom octave or so where it looked fine. (My CRT 'scope is usually attached!) And so I rigged up a test, which proved that FA2P can only read arrays up to 2048 entries .. so all is now explained. Evidently higher up the keyboard all I was getting was segments of those waves actually intended for the bottom notes, i.e. within the first 2048 enties.

I'm using FA2P all over 'HB3' without any problems, but in every case I'm using them just for extracting from arrays of length 72, indexed from my note number (0-71), one entry for each note. So no array size problem with that.

Yesterday I was working on a dsp module for the wave-read element, with a memin input, replaces the pair of Wave Reads and does the interpolation as well. Looking good.

Anyway ... yes I'm pretty sure you'd successfully maked an LFO or any other wave shape with FA2P, up to length 2048.

(Not of direct concern to me but I'm still wondering how Wave Read knows about Stereo & Mono wav files ...? )

later 8-)

Re: just one thing bothering me ..

Posted: Fri Nov 24, 2017 2:01 am
by martinvicanek
HughBanton wrote:In my quest for speed, Martin, would I gain from writing a dsp module with a memin input? I'm currently using a pair of Wave Reads with fractional interpolation (usual method), so I could incorporate that as well. Or would the pair of Wave Read prims perform as fast anyway?

We have done something of that sort here. Yes, that method is faster, however those crashes remain. I got so frustrated that I stopped using memin entirely. Perhaps the forthcomming release will have some improvements there.
You can use a stereo wave read with the right channel delayed by one sample.That way you can retrieve the two consecutive values for linear interpolation in one go. ;) Or better still, store the values in the left channel and the slopes in the right channellike in the (attached schematic.

Re: just one thing bothering me ..

Posted: Fri Nov 24, 2017 1:32 pm
by HughBanton
Or better still, store the values in the left channel and the slopes in the right channellike in the (attached schematic.


Martin, that's really neat, I didn't know of that interp architecture. (Why didn't I think of that :o ) I glued your module into my HB3 and was easily able to make it work. I can now get rid of my more complicated int/fraction splitter.

'Slope' is actually the value difference between adjacent samples, yes? My 72 waveforms are generated within my own dll modules, so I can easily add a few lines to my C code to calculate all the difference values, and then interleave them to output an array exactly like this.

So my sole remaining question .. what's in a 'stereo' wav file that defines it as stereo or mono, so the Wave Read knows its format?

A million thanks

Re: just one thing bothering me ..

Posted: Sat Nov 25, 2017 6:41 pm
by martinvicanek
HughBanton wrote:My 72 waveforms are generated within my own dll modules, so I can easily add a few lines to my C code to calculate all the difference values, and then interleave them to output an array exactly like this.
When you compute the slopes, make sure you get the ends of each waveform right. ;)
.. what's in a 'stereo' wav file that defines it as stereo or mono, so the Wave Read knows its format?
According to Wikipedia there is a <fmt-ck> format chunk in the file header which contains, among other things, the number of channels. Unless you want to generate wav files from your code, you don't have to bother. You can generate stereo mems within FS, refer to my post above.