Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клеим Звук, Как склеить 2 wav файла в один? 
V
    Опции темы
Ivankult
Дата 13.12.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Как склеить 2 wav файла в один?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
Экскалупатор
Дата 13.12.2009, 14:12 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



представляешь файлы как массив байтов и с склеиваешь два массива между собой. тут есть запара в том что в wav файле должен быть заголовок. вот тут есть похожая тема.
PM MAIL ICQ   Вверх
Ivankult
Дата 13.12.2009, 18:33 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



А стандартных функций в студии разве нет?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
Экскалупатор
Дата 13.12.2009, 19:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(agealex @  3.6.2009,  15:35 Найти цитируемый пост)
Там считываешь с начала массива  40 байт - это твой заголовок (весь заголовок занимает 44 байта учти при поправке на считывание,последние  4 байта длинна тела) - сохраняешь его в массив, затем при считывание буффера с нужного места дописываешь к заголовку сначала 4 байта длины будующего тела, а уж потом и само тело - и проигрываешь его, код вечером выложу.



я стандартных функция для этого не знаю. не работал с этим. но тут ничего сложного, по примерам из той темы можно сделать очень просто, там вроде все объясняется и примеры есть.
PM MAIL ICQ   Вверх
Ivankult
Дата 14.12.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Денис, если опустить громкость звука и всякую лабуду, нам надо только этот кусок кода:
Код

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Media;
using System.IO;
using System.Runtime.InteropServices;

namespace ShowDialog
{
    class Audio
    {
        #region SoundMixer
        [DllImport("coredll.dll", SetLastError = true)]        *********************
        protected static extern int waveOutSetVolume(IntPtr device, uint volume);*
                                                                                                                             *
        [DllImport("coredll.dll", SetLastError = true)]                                                *
                                                                                                                              *
        internal static extern int waveOutSetVolume(IntPtr device, int volume);      *
                                                                                                                              *
        [DllImport("coredll.dll", SetLastError = true)]                                                 *
                                                                                        *********************а это нам зачем, и что это вообще??
        #endregion                                                           


        #region declaretion

        private const byte WavHeaderSize = 40; //Размер заголовка Wav файла без размера тела (4 байта еще)
        private const byte WavHeaderBodyLenghSize = 4;// Размер тела WAV файла

        private const String WavFileName = "\\rus.wav"; // Название фалйла и путь к нему

        public byte[] SoundBuffHeader;
        private byte[] SoundBuffMain;

        public int BuffSize = 600000; //размер буфера
        public SoundPlayer Player;

        private FileStream FileStreamWav;
        private Stream SoundStream;

        #endregion

        public Audio()
        {
            //Буфера wav фала
            SoundBuffHeader = new byte[WavHeaderSize + WavHeaderBodyLenghSize];
            FileStreamWav = File.Open(WavFileName, FileMode.Open);
            SoundBuffMain = new byte[FileStreamWav.Length - WavHeaderSize - WavHeaderBodyLenghSize];

            #region BufferRead
            // Считывание заголовка
            FileStreamWav.Position = 0;
            FileStreamWav.Read(SoundBuffHeader, 0, WavHeaderSize); // Заголовок кроме последней длины


            #endregion

            SoundStream = new MemoryStream();
            Player = new SoundPlayer();
            Player.Stream = new MemoryStream();
        }

        //Воспроизводит WAV файлы
        public void PlaySound(int StartPosition, int StopPosition)
        {
            Player = new SoundPlayer();
            Player.Stream = new MemoryStream();
            int PlayingSoundSize = 0; // Размер тела wav файла
            byte[] DataLenArray;

            PlayingSoundSize = StopPosition - StartPosition;
            // Запись в заголовок информации о размере тела файла
            DataLenArray = BitConverter.GetBytes(PlayingSoundSize);
            DataLenArray.CopyTo(SoundBuffHeader, WavHeaderSize);
            DataLenArray = BitConverter.GetBytes(PlayingSoundSize + WavHeaderSize - WavHeaderBodyLenghSize);
            DataLenArray.CopyTo(SoundBuffHeader, WavHeaderBodyLenghSize);

            //Запись заголовка в проигрываемый файл
            Player.Stream.Position = 0;
            Player.Stream.Write(SoundBuffHeader, 0, SoundBuffHeader.Length);
            // Запись самого тела

            byte[] test = new byte[PlayingSoundSize];

            FileStreamWav.Position = StartPosition;
            FileStreamWav.Read(test, 0, PlayingSoundSize); // Весь файл кроме заголовка

            Player.Stream.Write(test, 0, test.Length);

            Player.Stream.Position = 0;

            Player.Load();
            Player.Play();


        }
        //Остановка плеера
        public void StopPlaying()
        {
            Player.Stop();
        }
    }
}





Теперь вопрос: зачем нам 2 буфера?
Тогда порядок действий для склеивания n файлов? Читаем первый, добавляем в очередь заголовок, добавляем к размеру нового файла размер текущего файла. Читаем следующий. потом получившийся массив читаем. Так?
Тааак. А теперь вопрос, куда в буфер плеера вставлять заголовки файлов?? Или этого не надо делать? Т.е. можно для заголовка использовать какую-то рандомную строку, а в буфер добавлять содержание файлов и соответсвенно увеличивать длину файла?

Это сообщение отредактировал(а) Ivankult - 14.12.2009, 19:15
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
KuMa1104
Дата 14.12.2009, 19:40 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Здравствуйте.
Ivankult Собственно зачем вам их склеивать?
Я же вам кинул пример(возможно не самый лучший но всётаки) того как это надо делать.

Это сообщение отредактировал(а) KuMa1104 - 14.12.2009, 19:41


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Ivankult
Дата 14.12.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



В том то и дело, что не самый лучший. Если склеить буквы слова и воспроизвести файл, то задержки и "тормоза" программы будут в местах пробелов и не будут заметны.+ мне нужна функция записи прочитанного в файл.

Денис, вот я накарябал код, но сомневаюсь что будет работать. Проверять страшно))) А если честно то это е работает. Где ошибки и "косяки"?
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq;
using System.Media;
using System.IO;
using System.Runtime.InteropServices;
using System.Collections;

namespace media
{
    class AudioWAV
    {
        private const byte WavHeaderSize = 40; //Размер заголовка Wav файла без размера тела (4 байта еще)
        private const byte WavHeaderBodyLenghSize = 4;// Размер тела WAV файла
        private String WavFileName = "\\rus.wav"; // Название фалйла и путь к нему
        public byte[] SoundBuffHeader;
        private byte[] SoundBuffMain;
        private byte[] SoundBuff;
        private ArrayList Sounds;
        private int SoundLength;
        public int BuffSize = 600000; //размер буфера
        public SoundPlayer Player;
        private FileStream FileStreamWav;
        private Stream SoundStream;        

        public AudioWAV(ArrayList soundsNames)
        {
            Sounds.Clear();
            SoundLength = 0;    // Размер тела нового файла        
            for (int i = 0; i < soundsNames.Count; i++)
            {
                WavFileName = (string)soundsNames[i];
                //Буфера wav файла
                SoundBuffHeader = new byte[WavHeaderSize + WavHeaderBodyLenghSize];
                FileStreamWav = File.Open(WavFileName, FileMode.Open);
                SoundBuffMain = new byte[FileStreamWav.Length - WavHeaderSize - WavHeaderBodyLenghSize];
                SoundLength += SoundBuffMain.Length;              
                FileStreamWav.Position = WavHeaderSize + WavHeaderBodyLenghSize;
                FileStreamWav.Read(SoundBuffMain, (int)FileStreamWav.Position, SoundBuffMain.Length);
                Sounds.Add(SoundBuffMain);
                FileStreamWav.Read(SoundBuffHeader, 0, WavHeaderSize); // Заголовок кроме последней длины
            }                        
            SoundStream = new MemoryStream();
            Player = new SoundPlayer();
            Player.Stream = new MemoryStream();                        
            byte[] DataLenArray; //буфер заголовка нового файла            
            // генерация заголовка файла            
            DataLenArray=new byte[WavHeaderSize+WavHeaderBodyLenghSize];
            DataLenArray.CopyTo(SoundBuffHeader,0);
            byte[] soundsize = BitConverter.GetBytes(SoundLength); int kpos = 0;
            for (int i = 0; i < WavHeaderBodyLenghSize; i++) 
            {
                DataLenArray[i + WavHeaderSize] = 0;
                if (i >= WavHeaderSize + WavHeaderBodyLenghSize - soundsize.Length)
                { DataLenArray[i + WavHeaderSize] = soundsize[kpos]; kpos++; }
            }
            //Запись заголовка в проигрываемый файл
            Player.Stream.Position = 0;
            Player.Stream.Write(DataLenArray, 0, DataLenArray.Length);
            byte[] test = new byte[SoundLength];  //генерация самого тела            
            int pos = 0;
            for (int i = 0; i < Sounds.Count; i++)
            {
                byte[] temps = (byte[])Sounds[i];
                for (int j = 0; j < temps.Length; j++)
                {
                    test[pos] = temps[j]; pos++;
                }
            }            
            //запись тела
            Player.Stream.Write(test,WavHeaderSize+WavHeaderBodyLenghSize, test.Length);
        }
        
        public void PlaySound()
        {            
            Player.Stream.Position = 0;
            Player.Load();
            Player.Play();
        }
        //Остановка плеера
        public void StopPlaying()
        {
            Player.Stop();
        }
    }
}



--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
KuMa1104
Дата 14.12.2009, 20:33 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Цитата(Ivankult @  14.12.2009,  20:15 Найти цитируемый пост)
Если склеить буквы слова и воспроизвести файл, то задержки и "тормоза" программы будут в местах пробелов и не будут заметны.+ мне нужна функция записи прочитанного в файл.

Вот поясните это, я не совсем вас понял.
Почему вы решили что задержки и тормоза программы будут в местах пробелов и не будут заметны?



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Ivankult
Дата 14.12.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Смотрите. Я побуквенно записываю в буфер звуки, потом воспроизвожу и собираю следующее слово, опять воспроизвожу, и т.д. Тогда все осн. команды и соответсвенно издержки, будут в местах пробелов, и пользователь это не заметит(какя разница-пробел будет длится 0,2 сек или 0.,4?)
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
KuMa1104
Дата 14.12.2009, 22:35 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Цитата(Ivankult @  14.12.2009,  21:20 Найти цитируемый пост)
 Я побуквенно записываю в буфер звуки

Я так понял что Вы имеете в виду не буфер звуковой карты, а просто буфер в памяти( т.е. грубо говоря масив баитов)в него вы кидаете данные отдельных слов

Слово "Мама"
Буфер = М+а+м+а  В вашем буфере 4 буквы после вы их воспроизводите.

Знаете если вы будете непосредственно подкидывать каждую букву то это даст на мои взгляд большую чуствительность и удобность в управлении.

Цитата(Ivankult @  14.12.2009,  21:20 Найти цитируемый пост)
 Тогда все осн. команды и соответсвенно издержки, будут в местах пробелов, и пользователь это не заметит(какя разница-пробел будет длится 0,2 сек или 0.,4?)


Хм На сколько я понимаю ваш алгоритм.
Код

воспроизвожу буфер(Мама)
идет задержка до следущего слова
Воспроизвожу следующий буфер (Мыла)


Лучше если когда вы програмируете под звуковую карту чтобы она работала в непрерывном режиме.
 У вас будет работать несколько потоков. 
1.  В обязанность одного будет входить только подкидывание новых буферов для воспроизведения.
2.  В обязанности другого извлекать данные для этих буферов и создовать очередь которая будет воспроизводится первым потоком.

Я бы посоветовал вас сделать анологично с алфавитом и пустые буферы для запятои точки пробела, разной длины и тогда просто подкидывать их в звуковую карту. 







--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Экскалупатор
Дата 14.12.2009, 23:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата

Теперь вопрос: зачем нам 2 буфера?


честно не знаю. может у человека там что то планировалось.

Цитата

Тогда порядок действий для склеивания n файлов? Читаем первый, добавляем в очередь заголовок, добавляем к размеру нового файла размер текущего файла. Читаем следующий. потом получившийся массив читаем. Так?


в общем похоже. в результате должно получиться так: заголовок(36 байт) +  4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки).

Цитата

Тааак. А теперь вопрос, куда в буфер плеера вставлять заголовки файлов?? Или этого не надо делать? Т.е. можно для заголовка использовать какую-то рандомную строку, а в буфер добавлять содержание файлов и соответсвенно увеличивать длину файла?


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

по поводу пробелов и прочего, я так понимаю что у тебя должен быть трек отвечающий за паузу, т.е. тут надо не вешать приложение на определенное время а просто вставлять нужную паузу в трек. т.е. фактически должен получиться один большой трек, в котором будет находиться все что нужно читать. если планируется читать что то большое("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними.

Добавлено @ 23:27
мне кажется что тут бы все ускорилось, если бы у тебя трек для каждой буквы был одного размера(в байтах) тогда можно было бы сразу подсчитать размер итогового буфера, и потом просто записать в него все что нужно, иначе придется менять размер при добавлении каждой новой буквы, а это чревато большими проблемами.

Это сообщение отредактировал(а) Экскалупатор - 14.12.2009, 23:28
PM MAIL ICQ   Вверх
KuMa1104
Дата 14.12.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Цитата(Экскалупатор @  14.12.2009,  23:25 Найти цитируемый пост)
по поводу пробелов и прочего, я так понимаю что у тебя должен быть трек отвечающий за паузу

В точку! smile 

Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с  разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль.

Я когдато давно, так случаино сделал, а на калонках была большая громкость....
Всех родных среди ночи перепугал 
 smile 


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Экскалупатор
Дата 15.12.2009, 00:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата

Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с  разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль.


да это правильно. в идеале, я считаю, надо вообще подготовить треки так что бы они во всем были одинаковы, ну кроме конечно содержания.

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

 smile если честно то я подобные программы вообще не очень жалую, потому что они для каких то лентяев сделаны. и когда такая программа читает книгу, то ощущения от такого "чтения" просто отвратительные. намного приятнее расположится в кресле с книжкой и читать самостоятельно.
PM MAIL ICQ   Вверх
Ivankult
Дата 15.12.2009, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Я не хотел в эту тему выкладывать свои сооброжения на тему говорилки(для этого есть своя тема) но ладно. Что я делаю:
1. Храню в БД или ресурс файле оцифрованные звуки(размер в байтах и массив байтов)
2.Читаю какую-то часть текста ("("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними.") и начинаю обрабатывать
3. Читаю в новую строку слово до первого пробела.
4. Обрабатываю слово(собираю трек), если есть такие вещи как мягкий  знак или е,ё,я,ю то это обрабатывается тут же.
5.Запускаю трек и на опр. время усыпляю поток(вместо пробела, точки, запятой, двоеточия и т.д.)
6.Очищаю строку слова(то что делал в п.3)
7. Повторяю с п3 до п7.

"Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с  разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль."

Не понял о чем речьhttp://forum.vingrad.ru/html/emoticons/pack/dash1.gif

Теперь вопрос Денису.

"в общем похоже. в результате должно получиться так: заголовок(36 байт) +  4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки)."

вообще-то, заголовок трека это 40 байт, + 4 байта длина файла(сумма длительности коротких треков),+само тело. Про заголовок спасибо что пояснил.

Посмотрите пожалуйста, что я наваял, может где-то что-то можно исправить или оптимизировать
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
Ivankult
Дата 15.12.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Вот что я наваял:

класс AudioWAV
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq;
using System.Media;
using System.IO;
using System.Runtime.InteropServices;
using System.Collections;

namespace media
{
    class AudioWAV
    {
        private const byte WavHeaderSize = 40; //Размер заголовка Wav файла без размера тела (4 байта еще)
        private const byte WavHeaderBodyLenghSize = 4;// Размер тела WAV файла
        private static String WavFileName = "\\rus.wav"; // Название фалйла и путь к нему
        public static byte[] SoundBuffHeader;
        private static byte[] SoundBuffMain;
        private static byte[] SoundBuff;
        private static ArrayList Sounds;
        private static int SoundLength;
        public static int BuffSize = 600000; //размер буфера
        public static SoundPlayer Player;
        private static FileStream FileStreamWav;
        private static Stream SoundStream;        

        public AudioWAV(ArrayList soundsNames)
        {
            Sounds = new ArrayList();
            SoundLength = 0;    // Размер тела нового файла        
            for (int i = 0; i < soundsNames.Count; i++)
            {
                WavFileName = (string)soundsNames[i];
                //Буфера wav файла
                SoundBuffHeader = new byte[WavHeaderSize];
                FileStreamWav = File.Open(WavFileName, FileMode.Open);
                SoundBuffMain = new byte[FileStreamWav.Length - WavHeaderSize - WavHeaderBodyLenghSize];
                int tempLength = SoundBuffMain.Length;
                SoundLength += tempLength;              
                FileStreamWav.Position = WavHeaderSize + WavHeaderBodyLenghSize;
                FileStreamWav.Read(SoundBuffMain, 0, tempLength);
                Sounds.Add(SoundBuffMain);
                FileStreamWav.Position = 0;
                FileStreamWav.Read(SoundBuffHeader, 0, WavHeaderSize); // Заголовок кроме последней длины
            }                                    
        }
        
        public void PlaySound()
        {
            SoundStream = new MemoryStream();
            Player = new SoundPlayer();
            Player.Stream = new MemoryStream();
            byte[] DataLenArray; //буфер заголовка нового файла            
            // генерация заголовка файла            
            DataLenArray = new byte[WavHeaderSize];// + WavHeaderBodyLenghSize];
            //DataLenArray.CopyTo(SoundBuffHeader, 0);
            DataLenArray = SoundBuffHeader;
            byte[] soundsize = BitConverter.GetBytes(SoundLength); int kpos = 0;
            byte[] ssz = new byte[WavHeaderBodyLenghSize];
            int g=3;
            for (int i = soundsize.Length - 1; i >= 0; i--)
            {
                ssz[g] = soundsize[i]; g--;
            }
            while (g >= 0) { ssz[g] = 0; g--; }
            //Запись заголовка в проигрываемый файл
            Player.Stream.Position = 0;
            Player.Stream.Write(DataLenArray, 0, DataLenArray.Length);
            //запись размера тела в проигрываемый файл
            Player.Stream.Position = DataLenArray.Length;
            Player.Stream.Write(ssz, 0, WavHeaderBodyLenghSize);
            byte[] test = new byte[SoundLength];  //генерация самого тела            
            int pos = 0;
            for (int i = 0; i < Sounds.Count; i++)
            {
                byte[] temps = (byte[])Sounds[i];
                for (int j = 0; j < temps.Length; j++)
                {
                    test[pos] = temps[j]; pos++;
                }
            }
            //запись тела
            Player.Stream.Position = WavHeaderSize + WavHeaderBodyLenghSize;
            Player.Stream.Write(test, 0, test.Length);
            Player.Stream.Position = 0;
            Player.Load();            
            Player.Play();
        }
        //Остановка плеера
        public void StopPlaying()
        {
            Player.Stop();
        }
    }
}



а вот код основного тела программы(не ругайтесь на ифы, так читабельнее, а потом ифы заменю на case)
Код

bool isRusChar(char ch)
        {
            if (ch == 'а') { return true; }
            if (ch == 'б') { return true; }
            if (ch == 'в') { return true; }
            if (ch == 'г') { return true; }
            if (ch == 'д') { return true; }
            if (ch == 'е') { return true; }
            if (ch == 'ё') { return true; }
            if (ch == 'ж') { return true; }
            if (ch == 'з') { return true; }
            if (ch == 'и') { return true; }
            if (ch == 'й') { return true; }
            if (ch == 'к') { return true; }
            if (ch == 'л') { return true; }
            if (ch == 'м') { return true; }
            if (ch == 'н') { return true; }
            if (ch == 'о') { return true; }
            if (ch == 'п') { return true; }
            if (ch == 'р') { return true; }
            if (ch == 'с') { return true; }
            if (ch == 'т') { return true; }
            if (ch == 'у') { return true; }
            if (ch == 'ф') { return true; }
            if (ch == 'х') { return true; }
            if (ch == 'ц') { return true; }
            if (ch == 'ч') { return true; }
            if (ch == 'ш') { return true; }
            if (ch == 'щ') { return true; }
            if (ch == 'ь') { return true; }
            if (ch == 'ы') { return true; }
            if (ch == 'ъ') { return true; }
            if (ch == 'э') { return true; }
            if (ch == 'ю') { return true; }
            if (ch == 'я') { return true; }
            if (ch == 'А') { return true; }
            if (ch == 'Б') { return true; }
            if (ch == 'В') { return true; }
            if (ch == 'Г') { return true; }
            if (ch == 'Д') { return true; }
            if (ch == 'Е') { return true; }
            if (ch == 'Ё') { return true; }
            if (ch == 'Ж') { return true; }
            if (ch == 'З') { return true; }
            if (ch == 'И') { return true; }
            if (ch == 'Й') { return true; }
            if (ch == 'К') { return true; }
            if (ch == 'Л') { return true; }
            if (ch == 'М') { return true; }
            if (ch == 'Н') { return true; }
            if (ch == 'О') { return true; }
            if (ch == 'П') { return true; }
            if (ch == 'Р') { return true; }
            if (ch == 'С') { return true; }
            if (ch == 'Т') { return true; }
            if (ch == 'У') { return true; }
            if (ch == 'Ф') { return true; }
            if (ch == 'Х') { return true; }
            if (ch == 'Ц') { return true; }
            if (ch == 'Ч') { return true; }
            if (ch == 'Ш') { return true; }
            if (ch == 'Щ') { return true; }
            if (ch == 'Ь') { return true; }
            if (ch == 'Ы') { return true; }
            if (ch == 'Ъ') { return true; }
            if (ch == 'Э') { return true; }
            if (ch == 'Ю') { return true; }
            if (ch == 'Я') { return true; }
            return false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            string word="";                                   
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                if (!isRusChar(textBox1.Text[i]))
                {
                    //обработка слова
                    //version 1  
                    ArrayList track = new ArrayList();
                    for (int j = 0; j < word.Length; j++)
                    {
                        char ch = word[j];
                        if (ch == 'а') { track.Add("E:\\media\\media\\Voice1\\1.wav"); }
                        if (ch == 'б') { track.Add("E:\\media\\media\\Voice1\\2.wav"); }
                        if (ch == 'в') { track.Add("E:\\media\\media\\Voice1\\3.wav"); }
                        if (ch == 'г') { track.Add("E:\\media\\media\\Voice1\\4.wav"); }
                        if (ch == 'д') { track.Add("E:\\media\\media\\Voice1\\5.wav"); }
                        if (ch == 'е') { track.Add("E:\\media\\media\\Voice1\\6.wav"); }
                        if (ch == 'ё') { track.Add("E:\\media\\media\\Voice1\\7.wav"); }
                        if (ch == 'ж') { track.Add("E:\\media\\media\\Voice1\\8.wav"); }
                        if (ch == 'з') { track.Add("E:\\media\\media\\Voice1\\9.wav"); }
                        if (ch == 'и') { track.Add("E:\\media\\media\\Voice1\\10.wav"); }
                        if (ch == 'й') { track.Add("E:\\media\\media\\Voice1\\11.wav"); }
                        if (ch == 'к') { track.Add("E:\\media\\media\\Voice1\\12.wav"); }
                        if (ch == 'л') { track.Add("E:\\media\\media\\Voice1\\13.wav"); }
                        if (ch == 'м') { track.Add("E:\\media\\media\\Voice1\\14.wav"); }
                        if (ch == 'н') { track.Add("E:\\media\\media\\Voice1\\15.wav"); }
                        if (ch == 'о') { track.Add("E:\\media\\media\\Voice1\\16.wav"); }
                        if (ch == 'п') { track.Add("E:\\media\\media\\Voice1\\17.wav"); }
                        if (ch == 'р') { track.Add("E:\\media\\media\\Voice1\\18.wav"); }
                        if (ch == 'с') { track.Add("E:\\media\\media\\Voice1\\19.wav"); }
                        if (ch == 'т') { track.Add("E:\\media\\media\\Voice1\\20.wav"); }
                        if (ch == 'у') { track.Add("E:\\media\\media\\Voice1\\21.wav"); }
                        if (ch == 'ф') { track.Add("E:\\media\\media\\Voice1\\22.wav"); }
                        if (ch == 'х') { track.Add("E:\\media\\media\\Voice1\\23.wav"); }
                        if (ch == 'ц') { track.Add("E:\\media\\media\\Voice1\\24.wav"); }
                        if (ch == 'ч') { track.Add("E:\\media\\media\\Voice1\\25.wav"); }
                        if (ch == 'ш') { track.Add("E:\\media\\media\\Voice1\\26.wav"); }
                        if (ch == 'щ') { track.Add("E:\\media\\media\\Voice1\\27.wav"); }
                        if (ch == 'ы') { track.Add("E:\\media\\media\\Voice1\\28.wav"); }
                        if (ch == 'э') { track.Add("E:\\media\\media\\Voice1\\29.wav"); }
                        if (ch == 'ю') { track.Add("E:\\media\\media\\Voice1\\30.wav"); }
                        if (ch == 'я') { track.Add("E:\\media\\media\\Voice1\\31.wav"); }
                        if (ch == 'А') { track.Add("E:\\media\\media\\Voice1\\1.wav"); }
                        if (ch == 'Б') { track.Add("E:\\media\\media\\Voice1\\2.wav"); }
                        if (ch == 'В') { track.Add("E:\\media\\media\\Voice1\\3.wav"); }
                        if (ch == 'Г') { track.Add("E:\\media\\media\\Voice1\\4.wav"); }
                        if (ch == 'Д') { track.Add("E:\\media\\media\\Voice1\\5.wav"); }
                        if (ch == 'Е') { track.Add("E:\\media\\media\\Voice1\\6.wav"); }
                        if (ch == 'Ё') { track.Add("E:\\media\\media\\Voice1\\7.wav"); }
                        if (ch == 'Ж') { track.Add("E:\\media\\media\\Voice1\\8.wav"); }
                        if (ch == 'З') { track.Add("E:\\media\\media\\Voice1\\9.wav"); }
                        if (ch == 'И') { track.Add("E:\\media\\media\\Voice1\\10.wav"); }
                        if (ch == 'Й') { track.Add("E:\\media\\media\\Voice1\\11.wav"); }
                        if (ch == 'К') { track.Add("E:\\media\\media\\Voice1\\12.wav"); }
                        if (ch == 'Л') { track.Add("E:\\media\\media\\Voice1\\13.wav"); }
                        if (ch == 'М') { track.Add("E:\\media\\media\\Voice1\\14.wav"); }
                        if (ch == 'Н') { track.Add("E:\\media\\media\\Voice1\\15.wav"); }
                        if (ch == 'О') { track.Add("E:\\media\\media\\Voice1\\16.wav"); }
                        if (ch == 'П') { track.Add("E:\\media\\media\\Voice1\\17.wav"); }
                        if (ch == 'Р') { track.Add("E:\\media\\media\\Voice1\\18.wav"); }
                        if (ch == 'С') { track.Add("E:\\media\\media\\Voice1\\19.wav"); }
                        if (ch == 'Т') { track.Add("E:\\media\\media\\Voice1\\20.wav"); }
                        if (ch == 'У') { track.Add("E:\\media\\media\\Voice1\\21.wav"); }
                        if (ch == 'Ф') { track.Add("E:\\media\\media\\Voice1\\22.wav"); }
                        if (ch == 'Х') { track.Add("E:\\media\\media\\Voice1\\23.wav"); }
                        if (ch == 'Ц') { track.Add("E:\\media\\media\\Voice1\\24.wav"); }
                        if (ch == 'Ч') { track.Add("E:\\media\\media\\Voice1\\25.wav"); }
                        if (ch == 'Ш') { track.Add("E:\\media\\media\\Voice1\\26.wav"); }
                        if (ch == 'Щ') { track.Add("E:\\media\\media\\Voice1\\27.wav"); }
                        if (ch == 'Ы') { track.Add("E:\\media\\media\\Voice1\\28.wav"); }
                        if (ch == 'Э') { track.Add("E:\\media\\media\\Voice1\\29.wav"); }
                        if (ch == 'Ю') { track.Add("E:\\media\\media\\Voice1\\30.wav"); }
                        if (ch == 'Я') { track.Add("E:\\media\\media\\Voice1\\31.wav"); }                        
                    }
                    AudioWAV WordWAV = new AudioWAV(track);
                    WordWAV.PlaySound();
                    Thread.Sleep(3000);
                    //
                    Thread.Sleep(200);                    
                    word = "";
                    continue;
                }                
                word+= textBox1.Text[i];                              
            }
            button1.Enabled = true;
        }    


Этот вариант полностью работает, все ошибки устранил

Это сообщение отредактировал(а) Ivankult - 15.12.2009, 22:02
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1204 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.