Как воспроизвести звуковой эффект по букве азбуки Морзе

поэтому я кодирую переводчик азбуки Морзе в визуальной студии С#, он принимает входной текст, а затем сохраняет его как азбуку Морзе в текстовый файл. Тем не менее, я пытаюсь закодировать воспроизведение звука для каждой буквы, достигнув этого, у меня есть файл .wav для каждой буквы в моем проекте визуальной студии. В этом коде у меня есть переводчик, который сопоставляет слова английских букв с соответствующими буквами кода Морзе, я пытаюсь воспроизвести соответствующий файл .wav вместе с переведенной буквой.

Вот код:

private static void InitializeDictionary()
{
    _morseAlphabetDictionary = new Dictionary<char, string>()
                               {
                                   {'a', ".-"},
                                   SoundPlayer snd = new SoundPlayer(@"C:\Users\keife\source\repos\MorseCodeTranslator\MorseCodeTranslator\AnyConv.com__A_morse_code.wav");
    snd.Play();
    { 'b', "-..."},
                                   {'c', "-.-."},
                                   {'d', "-.."},
                                   {'e', "."},
                                   {'f', "..-."},
                                   {'g', "--."},
                                   {'h', "...."},
                                   {'i', ".."},
                                   {'j', ".---"},
                                   {'k', "-.-"},
                                   {'l', ".-.."},
                                   {'m', "--"},
                                   {'n', "-."},
                                   {'o', "---"},
                                   {'p', ".--."},
                                   {'q', "--.-"},
                                   {'r', ".-."},
                                   {'s', "..."},
                                   {'t', "-"},
                                   {'u', "..-"},
                                   {'v', "...-"},
                                   {'w', ".--"},
                                   {'x', "-..-"},
                                   {'y', "-.--"},
                                   {'z', "--.."},
                                   {'0', "-----"},
                                   {'1', ".----"},
                                   {'2', "..---"},
                                   {'3', "...--"},
                                   {'4', "....-"},
                                   {'5', "....."},
                                   {'6', "-...."},
                                   {'7', "--..."},
                                   {'8', "---.."},
                                   {'9', "----."}
                               };
}

Однако код генерирует эту ошибку:

'SoundPlayer' - это тип, который недействителен в данном контексте.

Любые советы, как отформатировать это правильно? Большое спасибо.

Отредактированный код

     {'a', new MorseMapping(".-", 
      
     @"C:\Users\keife\source\repos\MorseCodeTranslator\MorseCodeTranslator\AnyConv.com__A_morse_code.wav")},
_morseAlphabetDictionary['a'].Player.Play();

   

person Keifer Bly    schedule 03.09.2020    source источник
comment
Вы помещаете этот код в инициализатор коллекции. Это не то, как они работают. Вам нужен либо другой словарь, который связывает символы со звуком, либо структура данных в этом словаре, которая связывает символы с кодом Морзе и звуком. Воспроизведение звука находится на совершенно другой странице.   -  person Fildor    schedule 03.09.2020
comment
может ли ваш soundnplayer воспроизводить только 1 файл? один экземпляр один файл?   -  person Mong Zhu    schedule 03.09.2020
comment
добро пожаловать в переполнение стека. Вы можете пометить ответ, который помог вам решить вашу проблему, как принятый. Я также говорю о других ваших вопросах, которые вы разместили на StackOverflow. Здесь показано, как это сделать. Удачного кодирования   -  person Mong Zhu    schedule 03.09.2020


Ответы (2)


вы пытаетесь создать и вставить SoundPlayer в блок инициализации словаря. Вот почему вы получаете ошибку, потому что словарь ожидает там пару char-string. Поместите его перед объявлением словаря:

SoundPlayer snd = new SoundPlayer(@"C:\Users\keife\source\repos\MorseCodeTranslator\MorseCodeTranslator\AnyConv.com__A_morse_code.wav");
_morseAlphabetDictionary = new Dictionary<char, string>()
                           {
                               {'a', ".-"},
                               

Во-вторых, я бы советовал мапить не только букву Морзе, а уже путь к соответствующему wav-файлу или всему звуковому плееру. Вы можете использовать для этого собственный класс

public class MorseMapping
{
    public string MorseLetter {get; set;}
    public SoundPlayer Player {get; set;}

    public MorseMapping(string letter, string filePath)
    {
         this.MorseLetter = letter;
         this.Player = new SoundPlayer(filePath):
    }
}

Теперь вы можете использовать этот класс в словаре:

_morseAlphabetDictionary = new Dictionary<char, MorseMapping>()
                           {
                               {'a', new MorseMapping(".-", @"C:\myPath\fileForA.wav")},
                               //.. here goes  the rest
                           }; // end of initialization block!!!

Теперь, если вы хотите воспроизвести звук для a, вы извлекаете свое сопоставление и используете звуковой проигрыватель:

_morseAlphabetDictionary['a'].Player.Play();

РЕДАКТИРОВАТЬ: очень важно!: вызвать игрока вне блока инициализации словаря. Не помещайте никакой другой код, кроме элементов словаря init внутри блока инициализации!

person Mong Zhu    schedule 03.09.2020
comment
Я только что вставил это в отредактированный код, но теперь он возвращает эту ошибку: «строка» не содержит определения для «Игрока», и не может быть найден доступный метод расширения «Игрок», принимающий первый аргумент типа «строка» (вам не хватает директива using или ссылка на сборку?Большое спасибо.Почему это? - person Keifer Bly; 03.09.2020
comment
@KeiferBly, решение Mongzhu очень хорошее. Судя по моим тестам, ошибки нет. Можешь поделиться фото ошибки? - person Jack J Jun - MSFT; 04.09.2020
comment
@KeiferBly ты изменил тип своего словаря на = new Dictionary<char, MorseMapping>()? или это все еще new Dictionary<char, string>() как в вашей оригинальной версии? - person Mong Zhu; 04.09.2020
comment
Да. Как и просили, вот фото. drive.google.com/file/d/1CXH-ck24_YZ63tZG2OnFhyLRaBZNd_7U/ Извините, мне не разрешили прикреплять к комментариям. В player.play появляется эта ошибка. Большое спасибо. - person Keifer Bly; 06.09.2020
comment
@KeiferBly, видимо, вы не читали первую часть моего ответа. Вы не можете поместить эту строку в {....}, это блок инициализации словаря! - person Mong Zhu; 07.09.2020

Основываясь на ошибке, которую вы указали в комментарии, вы можете попробовать следующий код для решения проблемы.

Пожалуйста, не вызывайте метод Player.Play() в словаре.

Код:

 class Program
    {
        static void Main(string[] args)
        {
            IntializeDictionary();
        }

        private static void IntializeDictionary()
        {
            Dictionary<char, MorseMapping> _morseAlphabetDictionary = new Dictionary<char, MorseMapping>()
            { {'a',new  MorseMapping(".-", @"C:\myPath\fileForA.wav") }
               //.. here goes  the rest
            };

            _morseAlphabetDictionary['a'].Player.Play();
        }

        public class MorseMapping
        {
            public string MorseLetter { get; set; }
            public SoundPlayer Player { get; set; }

            public MorseMapping(string letter, string filePath)
            {
                this.MorseLetter = letter;
                this.Player = new SoundPlayer(filePath);
        }
        }
    }
person Jack J Jun - MSFT    schedule 07.09.2020
comment
Спасибо, кажется, получилось! Сообщит, если возникнут еще проблемы. Спасибо - person Keifer Bly; 07.09.2020
comment
@KeiferBly, у меня нет других проблем. Если ваша проблема была решена, вы можете нажать «✔», чтобы отметить соответствующий ответ как ответ. - person Jack J Jun - MSFT; 07.09.2020