Good audio engine?

I’m looking for something that has two capabilities that SDL_Mixer does not:

  • Stereo panning of sounds between left/right speakers
  • Pitch shifting

I was thinking of using FMOD

http://www.fmod.org/index.php/sales

but found that their license fees are way too steep for me. ($3000 first platform, $1500 every subsequent platform!)

This engine also seems to have the features I need:

http://www.viremo.de/proteaAudio/index.html

But it gives me a bunch of link errors when I make it on MacOS X using “make” from the Unix Terminal, and I’m not good at fixing those kinds of errors. Any suggestions?

-Vern

In case anyone is curious of the link errors I’m getting for proteaAudio:

ar -rcs libproAudio.a proAudio.o proAudioRt.o stb_vorbis.o rtaudio/RtAudio.o
g++ -O2 -Wall -DHAVE_GETTIMEOFDAY -D__MACOSX_CORE__ -Irtaudio -Irtaudio/include -I…/lua/src -I…/archive/baseCode/include -c example.cpp -o example.o
g++ example.o libproAudio.a -o example.app
Undefined symbols:
"_AudioDeviceCreateIOProcID", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceDestroyIOProcID", referenced from:
RtApiCore::closeStream() in libproAudio.a(RtAudio.o)
RtApiCore::closeStream() in libproAudio.a(RtAudio.o)
"_AudioHardwareGetProperty", referenced from:
RtApiCore::getDefaultOutputDevice() in libproAudio.a(RtAudio.o)
RtApiCore::getDefaultOutputDevice() in libproAudio.a(RtAudio.o)
RtApiCore::getDefaultInputDevice() in libproAudio.a(RtAudio.o)
RtApiCore::getDefaultInputDevice() in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioStreamSetProperty", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceAddPropertyListener", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceGetProperty", referenced from:
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioHardwareGetPropertyInfo", referenced from:
RtApiCore::getDeviceCount() in libproAudio.a(RtAudio.o)
"_AudioDeviceStop", referenced from:
RtApiCore::closeStream() in libproAudio.a(RtAudio.o)
RtApiCore::closeStream() in libproAudio.a(RtAudio.o)
RtApiCore::stopStream() in libproAudio.a(RtAudio.o)
RtApiCore::stopStream() in libproAudio.a(RtAudio.o)
"_AudioHardwareSetProperty", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceGetPropertyInfo", referenced from:
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::getDeviceInfo(unsigned int)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceSetProperty", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioStreamGetProperty", referenced from:
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
RtApiCore::probeDeviceOpen(unsigned int, RtApi::StreamMode, unsigned int, unsigned int, unsigned int, unsigned long, unsigned int*, RtAudio::StreamOptions*)in libproAudio.a(RtAudio.o)
"_AudioDeviceStart", referenced from:
RtApiCore::startStream() in libproAudio.a(RtAudio.o)
RtApiCore::startStream() in libproAudio.a(RtAudio.o)

Hmmm, I just ran across:

http://www.ambiera.com/irrklang/index.html

It’s not free, but only about $460 for an unlimited products license (for products that sell for $40 or less). Much more doable. If it actually compiles for me out of hte box, I guess I’m sold, unless someone can suggest a better option.

-Vern

Hi,

I’m looking for something that has two capabilities that SDL_Mixer
does not:

at least for the first:
RTFM

  • Stereo panning of sounds between left/right speakers

http://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_80.html#SEC80

  • Pitch shifting

And pitch shifting is probably only an effect you need to implement and
register :wink: But this might be hard math.

Take a look at OpenAL.Am 28.09.2010 19:53, schrieb VernJensen:


Christoph Nelles

E-Mail : @Christoph_Nelles
Jabber : eazrael at evilazrael.net ICQ : 78819723

PGP-Key : ID 0x424FB55B on subkeys.pgp.net
or http://evilazrael.net/pgp.txt

Ahhh, thanks Christoph.

Turns out that irrKlang does not have iPhone support… so that kills it for me.

So does SDL_Mixer currently support iPhone? If so, looks like that’s what I’ll be using…

Would this work?
http://www.dspdimension.com/technology-licensing/dirac/On 9/28/10 11:58 AM, VernJensen wrote:

Ahhh, thanks Christoph.

Turns out that irrKlang does not have iPhone support… so that kills
it for me.

So does SDL_Mixer currently support iPhone? If so, looks like that’s
what I’ll be using…


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

I’d say it unofficialy supports it


it’s be nice to have sdl_mixer officially supported with a nice target
in the project file (hint hint)

bye
VittorioOn Tue, Sep 28, 2010 at 8:58 PM, VernJensen wrote:

Ahhh, thanks Christoph.

Turns out that irrKlang does not have iPhone support… so that kills it for
me.

So does SDL_Mixer currently support iPhone? If so, looks like that’s what
I’ll be using…


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

Another one : http://www.surina.net/soundtouch/

Martin

Andreas Schiffler wrote:> Would this work?

http://www.dspdimension.com/technology-licensing/dirac/

On 9/28/10 11:58 AM, VernJensen wrote:

Ahhh, thanks Christoph.

Turns out that irrKlang does not have iPhone support… so that kills
it for me.

So does SDL_Mixer currently support iPhone? If so, looks like that’s
what I’ll be using…


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org



SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

Another one : http://www.surina.net/soundtouch/

and: http://www.breakfastquay.com/rubberband/On Tue, Sep 28, 2010 at 11:05:58PM -0400, Martin Bisson wrote:

Martin

Andreas Schiffler wrote:

Would this work?
http://www.dspdimension.com/technology-licensing/dirac/

On 9/28/10 11:58 AM, VernJensen wrote:

Ahhh, thanks Christoph.

Turns out that irrKlang does not have iPhone support… so that
kills it for me.

So does SDL_Mixer currently support iPhone? If so, looks like
that’s what I’ll be using…


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org



SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


@Jacob_Meuser
SDF Public Access UNIX System - http://sdf.lonestar.org

well done you just volunteered yourself for adding pitch shift capabilities
to SDL_mixer :wink:

lots of people always asking for this, ending up doing some mad workaround
or giving up.

surely it is time someone actually stabbed this feature, i can barely
calculate n + 3 * m / x so not my job :wink:

audacity has pitch shift, presumably the code is open source, even if it
isnt realtime and prepares the samples you want on code init, surley is
better than nothing.

just saying :wink:

have a good code,

Neil.

audacity has pitch shift

audacity uses soundtouch, which has already been mentioned in this
threadOn Sat, Oct 02, 2010 at 03:52:04PM +0100, Neil White wrote:


@Jacob_Meuser
SDF Public Access UNIX System - http://sdf.lonestar.org

i only come here to start flame wars :wink:

when i was first coding, on RISC OS, it had great sound system, where the
commands to play a sound you specified a pitch and stuff like that, moving
to fixed samples has been a pain, but as my stuff only makes farting noises
and beeps its not too much of an issue for me.

yeah well, some people actually like to use computers for voice
communication.On Sat, Oct 02, 2010 at 07:17:26PM +0100, Neil White wrote:

i only come here to start flame wars :wink:

when i was first coding, on RISC OS, it had great sound system, where the
commands to play a sound you specified a pitch and stuff like that, moving
to fixed samples has been a pain, but as my stuff only makes farting noises
and beeps its not too much of an issue for me.


@Jacob_Meuser
SDF Public Access UNIX System - http://sdf.lonestar.org

my phone does voice search for contacts and now google, and it is quite good
at it as well, sorry i have no clue what i am doing here :wink:

go look at early unix “soundcards”. they were isdn devices. am79c30
in particualr.

yes, I know linux had the OSS SB, so what? modern machines don’t have
sound generators. they have sample converters. one could write a
sound generator api, but ultimately, it will have the same issues
no one here seems to be able to deal with, because modern hardware
is sample based, not “sound” based.On Sun, Oct 03, 2010 at 01:30:38PM +0100, Neil White wrote:

my phone does voice search for contacts and now google, and it is quite good
at it as well, sorry i have no clue what i am doing here :wink:


@Jacob_Meuser
SDF Public Access UNIX System - http://sdf.lonestar.org

Thanks for the replies, all. I’ve settled on using SDL_Mixer. Does everything I need except for pitch-shifting, and this is easily worked around by changing a few of my sound effects.

Of course, it’d be cool to use a sound library that could add echo effects in real-time, but for now, SDL_Mixer is great.

Well, Audiality/“the Kobo Deluxe sound engine” does both (pitch and various
realtime effects), but it’s pretty much an abandoned project. It’s still sort
of maintained as part of Kobo Deluxe, but will most probably be booted when I
have an operational replacement.

Don’t hold your breath for a production quality solution from this shop just
yet - but I will need a sound engine of some sort for this:
http://olofsonarcade.com/?p=104

So, I guess I’ll need to hack something in the next two weeks… I’m thinking
"simple wavetable synth core for EEL" (to replace it’s current sorry excuse
for audio API), but obviously, I’ll implement the core as a stand-alone
library with a C API.

(BTW, pitch shifting is the rather complicated and CPU intensive process of
altering the pitch of a sound without affecting it’s duration, and probably
not what you want here. :-)On Tuesday 19 October 2010, at 06.30.12, “VernJensen” wrote:

Thanks for the replies, all. I’ve settled on using SDL_Mixer. Does
everything I need except for pitch-shifting, and this is easily worked
around by changing a few of my sound effects.

Of course, it’d be cool to use a sound library that could add echo effects
in real-time, but for now, SDL_Mixer is great.


//David Olofson - Consultant, Developer, Artist, Open Source Advocate

.— Games, examples, libraries, scripting, sound, music, graphics —.
| http://olofson.net http://olofsonarcade.com http://kobodeluxe.com |
’---------------------------------------------------------------------’

You could mix the same sound back in with a delay and lower volume.On 19 October 2010 00:30, VernJensen wrote:

Thanks for the replies, all. I’ve settled on using SDL_Mixer. Does
everything I need except for pitch-shifting, and this is easily worked
around by changing a few of my sound effects.

Of course, it’d be cool to use a sound library that could add echo effects
in real-time, but for now, SDL_Mixer is great.

I know VLC does this on the fly whenever you speed up or slow down
playback. Works fine on my PC at least. It’s not ancient, but not
exactly new either.On 19 October 2010 05:33, David Olofson wrote:

(BTW, pitch shifting is the rather complicated and CPU intensive process
of altering the pitch of a sound without affecting it’s duration, and
probably not what you want here. :slight_smile: