Бип бип тест слуха в 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
)