Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: ЗвуГ Добавлено: 20.11.07 12:26  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф
Я где-то видел функцию, преобразовывающую звуковой файл в массив чисел, которые потом можно изменить и вновь воспроизвести. Тобишь можно написать редактор звука. Кто нибудь знает, что это за функция?

Заранее благодарен.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 intel-DX



ICQ: 445091742 

Вопросов: 4
Ответов: 169
 Профиль | | #1 Добавлено: 20.11.07 12:41
там и функции не надо читаеш бинарно вав и пишеш данные в масив байтов( почитай справочник Климова ) но там надо знать некоторье методы обработки звука

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 20.11.07 15:03
Я об этом и говорю

Ответить

Номер ответа: 3
Автор ответа:
 intel-DX



ICQ: 445091742 

Вопросов: 4
Ответов: 169
 Профиль | | #3 Добавлено: 20.11.07 17:20
WAV файл - это звуковой файл формата RIFF. Он состоит из трёх заголовков, за которыми следуют данные самого звукового файла, т.е. последовательность байт самого звукового сигнала. Разберём все три заголовка подробнее:

Первый - RIFF заголовок. Он занимает 8 байт с самого начала файла и содержит следующую информацию (для удобства всё описано в структуре данных Visual Basic'а):

Type RIFF_HEAD
riffFmt As String * 4 ' Четыре буквы "RIFF"
lenOfFileData As Long ' длина файла без этого заголовка,
' т.е. FileLen(Wav) - 8
End Type

Второй заголовок - WAV заголовок. Вот его структура:

Type WAVE_HEAD
waveFmt As String * 8 ' 8 букв - "WAVEfmt "
lenOfThunk As Long ' размер этого куска (16 байт)
format As Integer ' формат WAV файла (обычно всегда 1)
channels As Integer ' кол-во каналов (1 - моно, 2 - стерео)
samplesPerSecond As Long ' зазрешение WAV файла,
' т.е. кол-во Samples'ов в сек (11025,22050,44100 и т.д.)
avgBytesPerSecond As Long ' тоже самое
blockAlign As Integer ' выравнивание блоков данных (обычно 1)
bitsPerSample As Integer ' Кол-во Битов на один сэмпл (8/16)
End Type

Ну и наконец третий, заголовок данных:

Type DATA_HEAD
datastr As String * 4 ' 4 буквы "data"
lenOfThunk As Long ' кол-во байт,
' отводящихся под сами WAV данные
End Type

Ну вот и всё, далее идут сами данные звукового файла. Если файл 2-х канальный, то данные идут по очереди, 1 канал, 2-ой, 1-ый, 2-ой... и т.д. Необходимо также помнить, что если файл 8 битный, то под каждый сэмпл отводится по одному байту, если же 16 битный - то по 2 байта. В конце файла иногда бывает некоторая дополнительная информация о WAV файле (имя Автора и т.д.), которую позволяют вносить программы типа Sound Forge. Ну вот и всё. Можете делать со звуковыми файлами различные чудеса! Для удобства можете использовать мой модуль для работы с WAV файлами.

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 20.11.07 19:33
Посибо огромное!

Для удобства можете использовать мой модуль для работы с WAV файлами.

ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ
PLS PLS PLS PLS PLS PLS PLS PLS PLS
demon@kpost.ru

:)

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 21.11.07 01:26
ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ
То так при комунизме кричали, а щас только ПРОДАЙ...

Ответить

Номер ответа: 6
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #6
Добавлено: 21.11.07 13:07
intel-DX лучше знает!

Ответить

Номер ответа: 7
Автор ответа:
 intel-DX



ICQ: 445091742 

Вопросов: 4
Ответов: 169
 Профиль | | #7 Добавлено: 21.11.07 19:39
Это давно уже есть

Attribute VB_Name = "WaveFunctions"
Option Explicit

'===============================
'Модуль для работы с wav файлами
'Автор - Волков Антон
'Скачен с сайта vb.hut.ru
'===============================

' ===================================================================================================
Enum LEN_FORMAT
    frmSeconds = 0
    frmSamples = 1
End Enum
Type RIFF_HEAD
    riffFmt As String * 4
    lenOfFileData As Long
End Type
Type WAVE_HEAD
    waveFmt As String * 8
    lenOfThunk As Long
    format As Integer
    channels As Integer
    samplesPerSecond As Long
    avgBytesPerSecond As Long
    blockAlign As Integer
    bitsPerSample As Integer
End Type
Type DATA_HEAD
    dataStr As String * 4
    lenOfThunk As Long
End Type

' ===================================================================================================

' Функция возвращает массив данных из WAV файла

Public Function ReadWaveData(ByVal fileName As String, Optional howMany As Long) As Variant
    On Error GoTo ERRH
    Dim freeNum As Long
    Dim size As Long
    Dim bits As Byte
    
    freeNum = FreeFile
    Open fileName For Binary As #freeNum
        Get #freeNum, 41, size
        Get #freeNum, 35, bits
        If bits = 8 Then
            Dim arrByte() As Byte
        Else
            Dim arrInteger() As Integer
        End If
        If howMany < 0 Then
            If bits = 8 Then
                ReDim arrByte(size - 1)
            Else
                ReDim arrInteger(Int(size / 2) - 1)
            End If
        Else
            If howMany > size Or howMany = 0 Then howMany = size
            If bits = 8 Then
                ReDim arrByte(howMany - 1)
            Else
                ReDim arrInteger(howMany - 1)
            End If
        End If
        If bits = 8 Then
            Get #freeNum, 45, arrByte
        Else
            Get #freeNum, 45, arrInteger
        End If
    Close #freeNum
    If bits = 8 Then
        ReadWaveData = arrByte
    Else
        ReadWaveData = arrInteger
    End If
    Exit Function
ERRH:
    ReadWaveData = False
End Function

' ===================================================================================================

' Читает заголовок WAV файла

Public Function ReadWaveHeader(ByVal fileName As String, ByRef riffHead As RIFF_HEAD, ByRef waveHead As WAVE_HEAD, ByRef dataHead As DATA_HEAD) As Boolean
    On Error GoTo ERRH
    Dim freeNum As Long
    freeNum = FreeFile
    Open fileName For Binary As #freeNum
        Get #freeNum, , riffHead
        Get #freeNum, , waveHead
        Get #freeNum, , dataHead
    Close #freeNum
    ReadWaveHeader = True
    Exit Function
ERRH:
    ReadWaveHeader = False
End Function

' ===================================================================================================

' Переписать заголовок WAV файла

Public Function WriteNewWaveHeader(ByVal fileName As String, ByRef riffHead As RIFF_HEAD, ByRef waveHead As WAVE_HEAD, ByRef dataHead As DATA_HEAD) As Boolean
    On Error GoTo ERRH
    Dim freeNum As Long
    freeNum = FreeFile
    Open fileName For Binary As #freeNum
        Put #freeNum, , riffHead
        Put #freeNum, , waveHead
        Put #freeNum, , dataHead
    Close #freeNum
    WriteNewWaveHeader = True
    Exit Function
ERRH:
    WriteNewWaveHeader = False
End Function

' ===================================================================================================

' Создать WAV файл

Public Function CreateWaveFile(ByVal fileName As String, ByRef waveHead As WAVE_HEAD, ByVal waveData As Variant) As Boolean
    On Error GoTo ERRH
    Dim riffHead As RIFF_HEAD
    Dim dataHead As DATA_HEAD
    Dim freeNum As Long
    Dim arrBound As Long
    Dim arrToPut() As Byte
    freeNum = FreeFile
    arrBound = UBound(waveData)
    Open fileName For Binary As #freeNum
        riffHead.riffFmt = "RIFF"
        riffHead.lenOfFileData = arrBound + 37
        Put #freeNum, , riffHead
        
        waveHead.lenOfThunk = 16
        waveHead.waveFmt = "WAVEfmt "
        Put #freeNum, , waveHead
        
        dataHead.lenOfThunk = arrBound + 1
        dataHead.dataStr = "data"
        Put #freeNum, , dataHead
        
        ReDim arrToPut(arrBound)
        arrToPut = waveData
        Put #freeNum, , arrToPut
    Close #freeNum
    CreateWaveFile = True
    Exit Function
ERRH:
    CreateWaveFile = False
End Function

' ===================================================================================================

' Получить длину WAV файла (в сек. или в сэмплах)

Public Function GetLenOfWaveFile(ByVal fileName As String, format As LEN_FORMAT) As Single
    Dim riffHead As RIFF_HEAD
    Dim waveHead As WAVE_HEAD
    Dim dataHead As DATA_HEAD
       
    ReadWaveHeader fileName, riffHead, waveHead, dataHead
    If format = frmSeconds Then
        GetLenOfWaveFile = (dataHead.lenOfThunk / waveHead.samplesPerSecond)
    Else
        GetLenOfWaveFile = dataHead.lenOfThunk
    End If
End Function

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 24.11.07 14:50
VBD не ожидал от тебя такой вопрос.
Постучи в аську.

Ответить

Номер ответа: 9
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #9
Добавлено: 24.11.07 18:22
Аськи нету, я ее УБИЛАПСТЕНУ

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 24.11.07 20:22
гыгы лузер

Ответить

Номер ответа: 11
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #11
Добавлено: 24.11.07 20:37
Прекратить безобразие.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам