On Sunday 23 January 2005 06.22, Jeffrey Brown wrote: [...] > All I'll ever need is a library that will let me > playback a sample at a certain set of frequencies -- > like 6 at a time (bass tone, high tone, and a > four-note chord) -- until keyboard input signals it to > stop. In fact, even that's more than I need -- if > playing a sample is hard, I'd be perfectly happy > listening to square waves.
Square waves are actually quite hard to do well. :-) Sines are much easier, and if you don't need loads of voices, you can construct other waveforms - nicely bandlimited and alias free - by just adding the appropriate harmonics or other overtones, stopping at half the sample rate (Nyqvist). (You may need to roll off the amplitude of the highest few overtones, if the ringing is too audible.) If you *really* want to keep things simple, and don't need sampled sounds (which are far from trivial to play back at arbitrary rates without distortion), I think you should go with some nice and simple "raw audio API", such as PortAudio or perhaps SDL. SDL doesn't support audio or MIDI input, but does support audio output and is very portable. It also makes it very easy to implement "interactive" mouse and keyboard input. (It's designed for games and multimedia applications, so one would expect nothing less...) Finally, SDL provides a simple portable threading API, and there's a dead simple way of doing safe interaction with the audio callback: SDL_LockAudio()/SDL_UnlockAudio(), which ensures that the audio callback doesn't fire while you're messing with the shared data. (Real time programmers like myself will of course tell you to *never* lock the audio thread like that, since that degrades determinism to the level of the locking thread - but for a non-critical application, it sure beats random data corruption! :-) [...] > Is there a non-threatening, perhaps even > easy-to-install, C++ library that will do what I have > in mind? A library is probably overkill for this job, unless you need high quality sample playback. It's just too simple to deserve a library of it's own, so any library will do a lot more than what you need, which means added complexity. It's probably easier to learn how to generate sine waves and send them to the sound card than to learn any higher level audio library. As to threading, any audio API or audio library that's seriously usable for interactive applications will have to use threads or similar one way or another. PortAudio, SDL and most serious audio APIs use callbacks that run in the context of a "hidden" audio thread, or (on some platforms) in interrupt context. This is because you *must* maintain a steady stream of data to the audio driver at all times, or you'll get horrible sounding breaking up or looping. When you want low latency as well (you don't want to wait several seconds to hear the result of tweaking the EQ in your media player, do you?), this just doesn't mix with the way "normal" application programming is done - so you want to keep the actual audio processing in it's own thread. I have some SDL programming examples on my site. Nothing that does quite what you need (the PC speaker emulator would be the closest match), but if I get bored tonight, I might subvert one of them into a very basic additive toy synth. :-) http://olofson.net/mixed.html (speaker.tar.gz) "Simple, useless PC speaker emulator/driver for SDL. It supports the audio API (that part is a speaker emulator, which should be portable) as well as the X bell API (X only) and the Linux console. Includes sound FX engine + sound effects from the DOS version of Project Spitfire." http://olofson.net/examples.html (simplemixer-1.1.tar.gz) "A very simple sound mixing example, using only SDL without any add-on libraries. It plays a drum pattern using 4 sounds and 4 voices and not too tight timing. ;-)" //David Olofson - Programmer, Composer, Open Source Advocate .- Audiality -----------------------------------------------. | Free/Open Source audio engine for games and multimedia. | | MIDI, modular synthesis, real time effects, scripting,... | `-----------------------------------> http://audiality.org -' --- http://olofson.net --- http://www.reologica.se ---
