webmail123 Ответов: 1

Бип бип тест слуха в C#


Я работаю над этим .Чистая компактная Framework версии 3.5. Я хочу, чтобы генерировать звуковой сигнал для моего устройства и я имею в виду код, который записывается в VB.Net. Но проблема в том, что я не могу использовать один и тот же формат волны в C#.Net-да. Я имею в виду эту нить для генерации звукового сигнала

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c2b953b6-3c85-4eda-a478-080bae781319/beep-beep?forum=vbgeneral[^]

Что я уже пробовал:

using System.Collections.Generic;
using System.Text;
using System.Media;

namespace RFID_IndicateRSSI
{
    class beep
    {
        public void Beep(int Amplitude, int Frequency, int Duration)
        {
            double A = ((Amplitude * 2 ^ 15) / 1000) - 1;
            double DeltaFT = 2 * Math.PI * Frequency / 44100;
            
            int Samples = 441 * Duration;
            int Bytes = Samples * 4;
            int[] hdr = {&H46464952, 36 + Bytes, &H45564157,&H20746D66, 16, &H20001, 44100,176400, &H100004, &H61746164, Bytes};
            using (MemoryStream MS = new MemoryStream(44 + Bytes))
            {

                using (BinaryWriter BW = new BinaryWriter(MS))
                {
                    for (int i = 0; i < hdr.Length-1; i++)
                    {
                        BW.Write(hdr[i]);
                    }
                    for (int i = 0; i < Samples -1; i++)
                    {
                        short sample;
                        sample = Convert.ToInt16(A * Math.Sin(DeltaFT * i));
                        BW.Write(sample);
                        BW.Write(sample);
                    }
                    BW.Flush();
                    MS.Seek(0, SeekOrigin.Begin);
                    using (SoundPlayer SP = new SoundPlayer(MS))
                    {
                        SP.Stream = null;
                        SP.Stream = MS;
                        SP.PlaySync();                        
                    }
                }
            }
        }

    }
}


Я попробовал этот код, но значение в технологии HDR все ошибки. Ошибка заключается в том, что "заголовок волны поврежден", даже если я попытаюсь написать какой-то другой поток данных, он также не будет принят. Мне нужна помощь с этим делом.

P.S. Я не могу использовать Console.beep(). Он не поддерживается Net Compact framework.

Richard Deeming

Если вы хотите, чтобы кто-то помог вам исправить ошибку, то вам нужно сказать нам, что это за ошибка.

Нажмите на зеленую ссылку "улучшить вопрос" и добавьте полную информацию об ошибке, которую вы получаете.

webmail123

@Richard извините за путаницу. Я обновил вопрос.

Richard Deeming

Я заметил, что вы изменили расчет для Samples - вы уверены, что это значение все еще действует?

Основываясь на потоке MSDN, он должен быть:

int Samples = 441 * Duration / 10;

webmail123

@Richard Спасибо за ответ. Я думаю, что это совсем не проблема. Проблема заключается в hdr[]. Этот конкретный формат волнового файла не распознается. Так вот почему я получаю ошибку.

Richard Deeming

Я предполагаю, что вы заменили шестнадцатеричный префикс VB (&H) с помощью C# one (0xВ противном случае вы получите ошибку компилятора.

Richard Deeming

Кроме того, расчет для A неправильно перевел. В VB, ^ означает в силу, но в C# это означает Исключающее или.

Так и должно быть:

double A = ((Amplitude * Math.Pow(2, 15)) / 1000) - 1;

Richard Deeming

А твой for цикл не повторяется по всему циклу hdr массив. Так и должно быть:

for (int i = 0; i < hdr.Length; i++)
(Нет i < hdr.Length - 1)

1 Ответов

Рейтинг:
10

Richard Deeming

Вот исправленный перевод этого слова: VB.NET код, который работает для меня на полном фреймворке:

using System;
using System.IO;
using System.Media;

static class beep
{
    public static void Beep(int Amplitude, int Frequency, int Duration)
    {
        double A = ((Amplitude * Math.Pow(2, 15)) / 1000) - 1;
        double DeltaFT = 2 * Math.PI * Frequency / 44100;
        
        int Samples = 441 * Duration / 10;
        int Bytes = Samples * 4;
        int[] hdr = { 0x46464952, 36 + Bytes, 0x45564157, 0x20746D66, 16, 0x20001, 44100, 176400, 0x100004, 0x61746164, Bytes };
        
        using (MemoryStream MS = new MemoryStream(44 + Bytes))
        using (BinaryWriter BW = new BinaryWriter(MS))
        {
            for (int i = 0; i < hdr.Length; i++)
            {
                BW.Write(hdr[i]);
            }
            for (int i = 0; i < Samples; i++)
            {
                short sample;
                sample = Convert.ToInt16(A * Math.Sin(DeltaFT * i));
                BW.Write(sample);
                BW.Write(sample);
            }
            
            BW.Flush();
            MS.Seek(0, SeekOrigin.Begin);
            
            using (SoundPlayer SP = new SoundPlayer(MS))
            {
                SP.Stream = null;
                SP.Stream = MS;
                SP.PlaySync();
            }
        }
    }
}

Надеюсь, что это также должно сработать на CF. :)


webmail123

Большое спасибо. Наконец-то это сработало!!!!!