By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,458 Members | 1,463 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,458 IT Pros & Developers. It's quick & easy.

how to create a WAV file of different tones?

P: n/a
hi,
i'm trying to create a WAV file using c# that will contain a set of
beep tones, which are only known at run time. It is a bit like morse
code except that each tone will correspond to an alphanumeric
character. I've searched around the newsgroups and google and most of
what i found was about using Win32 functions to perform system beeps,
but i want to create a WAV file containing the beeps, not beep out
through the system speaker.
i've looked at DTMF but i'm looking for something with a complete
'alphabet' of sounds, not just the digit tones. i'm expecting to
define my own alphabet of tones, but have no idea where to start.
if someone could give me a few pointers i'd be really grateful.
tim
Jun 27 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On Wed, 25 Jun 2008 04:40:50 -0700, Tim_Mac <ti*****@gmail.comwrote:
i'm trying to create a WAV file using c# that will contain a set of
beep tones, which are only known at run time. It is a bit like morse
code except that each tone will correspond to an alphanumeric
character.
How is that different from Morse code? By "tone" do you mean frequency?
[...]
i've looked at DTMF but i'm looking for something with a complete
'alphabet' of sounds, not just the digit tones. i'm expecting to
define my own alphabet of tones, but have no idea where to start.
if someone could give me a few pointers i'd be really grateful.
It's hard to know exactly what you're asking to do. Are you having
trouble with the WAV file format itself? Or are you having trouble with
ideas for how to build a specific WAV file? In what way is your question
related to C# and/or .NET?

As far as some general answers go...

Writing a tone generator is reasonably simple, especially for sine waves.
Just output the appropriate samples based on time, using a sine function.
I think Math.Sin() is probably fast enough on modern PCs, but I suppose
for performance reasons you might want to build a table at the sampling
rate you plan to use that represents a single period of the wave, and then
just copy values from the table.

If you have just one frequency, you'd need only one table. If you wanted
to apply the same logic to other frequencies, you'd interpolate. For best
results, you'd probably want more than one table, representing tones no
more than an octave or two apart (note that each table will be of a
different length if you are making them just one period of the wave). For
frequencies not represented exactly by a given table, you'd pick the
nearest table for interpolation purposes.

You _could_ create "an alphabet of tones", I suppose. But it seems to me
that generating them on the fly should be fast enough and probably simpler
and more flexible an approach. If you've got code to generate them on the
fly, then you're halfway to a full-fledged synthesizer. :)

Then you're left writing the data to a file. For that, you simply need to
read up on the WAV file format.

Note that if you can use DirectMusic (either from unmanaged code, or using
p/invoke from C#), this might be a lot easier. It has synthesis features
built right into it and if I recall correctly can generate WAV data as
well.

Pete
Jun 27 '08 #2

P: n/a
hi Pete. thanks for your very informative reply.
i meant 'tone' in the general sense like a 'ring tone', technically it
should be that each letter/digit translates to a different frequency.
in terms of an alphabet, i only mean having a pre-defined mapping of
frequencies to letters/digits, that can be encoded by a server into
WAV and decoded by a client hearing the file played back. just like
the way DTMF tones are used to communicate through an automated phone
system. although the application is speaker/microphone based instead
of using any cabled medium.
the question is related to c# because .Net is the platform the
application is being developed in. in the absence of a .Net sound
newsgroup, i picked c# as a best bet. i gather the APIs in the .Net
framework don't do any sound creation or manipulation, so in that
sense you're right it isn't much to do with c#. although since there
is a Win32 function to emit a beep at a specified frequency and
duration, i thought it would not be too much to hope that a similar
function would be available (somewhere) that would output the sound to
a file rather than the outputting directly through PC sound-card or
speaker.
DirectMusic looks like exactly what i was hoping for... i'll probably
end up writing a library that could work something like this:

public void Encode(string code, string filename)
{
using(MemoryStream ms = new MemoryStream())
{
foreach(char c in code.ToCharArray())
ms.Write(TranslateCharToAudio(c));
}
writeStreamToDiskInWavFormat(filename) etc
}

thanks for pointing me in the right direction.
tim.
Jun 27 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.