void BwDoWork(object sender, DoWorkEventArgs e)
        {
            var args = e.Argument as BackgroundWorkerArgs;

            e.Result = args;

            short nCh         = 1;
            int   sampleFreq  = 44100;
            int   sineFreq    = sampleFreq / 4;
            long  nPeriod     = (long)(args.durationSec * sineFreq);
            long  nFrames     = nPeriod * 4;
            long  nFrameBytes = nFrames * nCh * 4; // 8==sizeof float

            if (0x7fff0000 < nFrameBytes)
            {
                args.errMsg = "Error: Sound Duration is too long!";
            }

            try {
                using (var bw = new BinaryWriter(File.Open(args.path, FileMode.Create))) {
                    var wwl           = new WavWriterLowLevel();
                    int dataChunkSize = (int)(nFrameBytes);
                    int riffChunkSize = 4    /* RIFF */
                                        + 26 /* fmt */
                                        + 8  /* DATA */
                                        + dataChunkSize;

                    wwl.RiffChunkWrite(bw, riffChunkSize);
                    wwl.FmtChunkWriteEx(bw, nCh, sampleFreq, 32, WavWriterLowLevel.WAVE_FORMAT_IEEE_FLOAT, 0);
                    wwl.DataChunkHeaderWrite(bw, dataChunkSize);
                    for (int i = 0; i < nPeriod; ++i)
                    {
                        var signal = new float[] {
                            0.0f,
                            +(float)Math.Pow(10, args.magnitude / 20.0),
                            0.0f,
                            -(float)Math.Pow(10, args.magnitude / 20.0),
                        };
                        bw.Write(signal[0]);
                        bw.Write(signal[1]);
                        bw.Write(signal[2]);
                        bw.Write(signal[3]);
                    }
                }
            } catch (System.Exception ex) {
                args.errMsg = ex.ToString();
            }
            args.errMsg = "";
        }