Страница: 1 |
Страница: 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
Посибо огромное!
ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ ДАЙ
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-сайт:
Профиль | | #11
Добавлено: 24.11.07 20:37
Прекратить безобразие.