how to create a WAV file of different tones?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Tim_Mac

    how to create a WAV file of different tones?

    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
  • Peter Duniho

    #2
    Re: how to create a WAV file of different tones?

    On Wed, 25 Jun 2008 04:40:50 -0700, Tim_Mac <timmer3@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

    Comment

    • Tim_Mac

      #3
      Re: how to create a WAV file of different tones?

      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(MemoryStr eam ms = new MemoryStream())
      {
      foreach(char c in code.ToCharArra y())
      ms.Write(Transl ateCharToAudio( c));
      }
      writeStreamToDi skInWavFormat(f ilename) etc
      }

      thanks for pointing me in the right direction.
      tim.

      Comment

      Working...