[chuck-users] Audio Range and Zero-crossings, Performance, Hashes and Future DIrections

Veli-Pekka Tätilä vtatila at mail.student.oulu.fi
Sun Mar 4 08:30:37 EST 2007


Hi list,
I'm new here. I'm a 20 something sight-impaired programmer and musician from 
Finland. I've got experience using analogs both virtual and real and know 
how to build Reaktor patches as well as program in Java, Perl and C. Now 
I've picked up the basics of ChucK and read through the PDF manual that 
comes with the program. Looks good and certainly a great deal more 
accessible than recent versions of Reaktor if you're using magnification and 
a screen reader program. I've got a flurry of questions I'll ask here.

ChucK says it is:
 chuck version: 1.2.0.7b (dracula)
   exe target: microsoft win32

1. What's the range of the audio float datatype and what would be the best 
way to detect zero crossings? My aim is to write a simple app that counts 
the samples in the low and high phases of a pulse wave and prints out the 
pulse width whenever it changes. If I can also get MIDi input into the app 
it would be quite easy to determine how pulse width in percentages changes 
as the function of the pulse width knob in my virtual and real analogs, 
whose exact values are not documented.

Here's some prototypical code (this is my first real chucK script):

Code:
100::ms => dur blockSize; // Processing resolution.
until(adc.last() < 0) // Measure low-phase first.
   blockSize => now;
// SAmple counters:
0 => int positive;
0 => int negative;
while(true)
{
   adc.last() => float sample;
   if(sample > 0)
      ++positive;
   else if(sample < 0)
   {
      ++negative;
      if(positive > 0) // Measured at least one cycle.
         <<< "Width: ", 100 * negative / (negative + positive) >>>;
      0 => positive => negative; // Reset counters.
   } // else if
   // Ignore the pure 0 value.
   blockSize => now;
} // while
End code.

However, when I run this, the app doesn't ever seem to get past the until 
loop. I'm assuming here that samples are floats or doubles from -1 to 1 as 
in VST, as I didn't find the range in the manual. Is this correct? IF not, 
it's no wonder the code won't work, <smile>. Of course the rather grainy 
test processing rate, ten times a sec, affects matters greatly but I don't 
ever seem to get negative sample values even in arbitrary audio. The adc and 
dac modules do work. IF I patch them together and record from the wave input 
I get a delayed copy of the input in the output I guess this is the audio 
equivalent of "cat".

2. Why is it that ChucK locks up when I try to process things at the rate of 
1::samp? This is what I'd use in the working code but when I try that CPU 
usage peaks and I have a hard time killing ChucK. Might ChucK be polling som 
system wide keyboard hooks or something. I'm using  a screen reader which I 
run together with ChucK. I do know it has blocking hooks deep in the OS both 
in keyboard handling and graphics i.e. GDI or DirectDraw. The OS is XP Pro 
SP2 English and this laptop is an HP NX8220. The reader and magnifier is 
Dolphin Supernova 7.03 beta 7.

3. Is there any way to decrease the latency on WIndows platforms for true 
realtime MIDI playback and audio processing similar to Reaktor? DirectSound 
latency is pretty bad as my audio machine, which isn't this laptop, would 
have both WDM kernel streaming and ASIO support in it.

4. How does one use the ZeroX module for detecting zero crossings? What's 
the value range and what is the output method of that module called i.e. 
which thing should I poll to detect the crossings?

The manual says:

Quote:
Emits a single pulse at the the zero crossing in the direction of the zero 
crossing
(see examples/zerox.ck)
End quote.

That path is slightly outdated, by the way. I found the example in:

.\examples\basic\zeroX.ck

The example uses the module patchd in the DAC directly, so I never see the 
values it produces in processing.

5. Continuing with modules I've discovered that there are the low level 
programming constructs, a few basic ugens and then fancy entities that would 
be instruments in Reaktor speak and remind me of Korg's physical modelling. 
Are additional basic modules going to be added in the future? Ideally, I'd 
like, in addition to implementing the constructions as program code, use 
ChucK as a more conventional modular synthesizer. Reaktor has got very very 
generic modules in it stuff like digital gates and sequential circuits, 
multiplexing and demultiplexing, comparators, waveshaping, variable delays, 
lookup tables, step sequencers and so on. YOu get the picture. While it is 
true that many of these things can be simulated easily and even more 
flexibly in program code, that doesn't feel like programming a modular 
synth, if you know what I mean. But then again, that might not be the aim of 
ChucK. Maybe I could use ChucK itself to model some of those, if that's 
possible, inheriting from a ugen that is. Is there example code for 
something like that, whose primary focus is not the audio processing itself 
as it often is in DSP? I'm not actually much good in higher math.

6. How do you use the array datatype in ChucK as a hash? I read that you can 
index the array with strings much like a Perl hash, except that numbres and 
strings are totally separate. If I get handed a hashtable whose keys I don't 
know beforehand, is there a keys or each function for iterating through the 
hash's keyset? Is the hash portion of the array unordered as one might 
expect in an implementation e.g. an array of pointers to linked-lists?

Thanks for any help in advance.
And sorry about these complaints, I just thought ChucK would have been a 
more complete piece of software than it currently is. Well, it has developed 
loads since I read the manual last time and decidedd back then it isn't 
quite ready yet, however. Now it is complete enough that I could imagine 
using it as a Reaktor and VSt plug substitute for some things. Another bonus 
is that it is available for LInux, so one of my friends whose into Linux and 
music could use it, too. i've already hyped the prog. I'm much more 
comfortable handling memory and doing processing in ChucK or Java than I am 
in C++, for instance.

-- 
With kind regards Veli-Pekka Tätilä (vtatila at mail.student.oulu.fi)
Accessibility, game music, synthesizers and programming:
http://www.student.oulu.fi/~vtatila/ 



More information about the chuck-users mailing list