Страница: 1 |
Страница: 1 |
Вопрос: Синтез звука, пожалуйста помогите!
Добавлено: 24.04.07 19:12
Автор вопроса: Затычкин К. И | ICQ: 457-842-713
Здравствуйте!
Скажите пожалуйста, возможно ли средствами ВБ6 синтезировать звук? К примеру мне нужен звук c частотой (X) с амплитудой (Y) и длительностью (Z) мск. Если его можно получить в среде ВБ6, то пожалуйста приведите пример кода!!! Все благодарен!
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
Wolf4D
Вопросов: 20
Ответов: 131
Web-сайт:
Профиль | | #1
Добавлено: 24.04.07 23:19
Знаю как такое сделать с выводом на PC Speaker.
Но это элементарно и практического применения (кроме как напугать юзера пищанием в процессе работы программы) не имеет.
Номер ответа: 2
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #2
Добавлено: 24.04.07 23:29
Ну а как же тогда синтезируют звуки? Веди такими же способами - изменениями характеристик данного, простейшего звука и создают различные формы звуков..
Номер ответа: 3
Автор ответа:
Wolf4D
Вопросов: 20
Ответов: 131
Web-сайт:
Профиль | | #3
Добавлено: 24.04.07 23:36
Проблема в том, что известный мне способ работает ТОЛЬКО с PC Speaker'ом.
Да, характеристики менять можно.
Ни о каком выводе звука на аудиовыход речи не идёт. Это одна стандартная API-функция, куда вводятся параметры, а в ответ система заставляет "пищалку" издать голос с определёнными характеристиками.
Про более серьёзное - не ко мне - квалификации в этом вопросе моей не хватает.
Но вот моё ИМХО - на VB писать библиотеку для синтеза звука не разумно (возможно, даже нереально). Разумнее задуматься над поиском таковой на C++ (может, даже найдётся OpenSource).
Посмотрим, что скажут по этому поводу более квалифицированные люди...
Номер ответа: 4
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #4
Добавлено: 24.04.07 23:41
А, вы за пищалку.. Я тоже знаю этот код, но хотелось бы вывести этот звук на аудиовыход. Тогда понятно, благодарю!
Номер ответа: 5
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #5
Добавлено: 24.04.07 23:52
А вообще средствами ВБ6 можно разрабатывать программы для обработки звука? На пример, хотя бы создать в простейшем проигрывателе wav-файла эквалайзер? Или более сложное что-то...(эхо, реверс и т.д)
Номер ответа: 6
Автор ответа:
Wolf4D
Вопросов: 20
Ответов: 131
Web-сайт:
Профиль | | #6
Добавлено: 24.04.07 23:56
Эквалайзер есть в примерах. Про более сложное не уверен...
Номер ответа: 7
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #7
Добавлено: 25.04.07 00:01
А вообще, скажите пожалуйста, ВБ подходит для решения задач со звуком или он не способен качественно работать в таком направлении?
Благодарю!
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 25.04.07 00:27
А неплохо было бы заюзать поиск и найти тему, где я приводил и примеры синтеза звука, и его частотного анализа.
Номер ответа: 9
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #9
Добавлено: 25.04.07 15:34
Могу скинуть пример для этого дела на DirectX 8 для VB6. 192-496-851
Все выводится прямо в колонки, даже можно регулировать громкость каждой, если не ошибаюсь
Номер ответа: 10
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #10
Добавлено: 25.04.07 18:01
Было бы интересно еще узнать как работать из ВБ6 с МИДИ. На пример отдать какую-нить команду синтезатору. Такое предоставляется возможностями ВБ6?
Номер ответа: 11
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #11
Добавлено: 25.04.07 18:53
неа)
Номер ответа: 12
Автор ответа:
Wolf4D
Вопросов: 20
Ответов: 131
Web-сайт:
Профиль | | #12
Добавлено: 25.04.07 19:13
Вот здесь полно всяких примеров по работе с MIDI (ну и не только): http://vbnet.ru/samples/showgroup.aspx?id=11 C отсылкой команды синтазатору сложнее...
Номер ответа: 13
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #13
Добавлено: 26.04.07 03:19
а шо там сложного? Темболее когда есть готовое ))
' Ôîðìàò © Äàíèë Áåëÿåâ
Option Explicit
Public Event Tact(Lng_Event_Tact As Long)
Public Event List(Lng_Event_List As Long, Lng_Event_Count As Long)
Public Event Note(Lng_Event_Note As Long)
Private Enum XO_Stub
XO_Stub_None
XO_Stub_Note
XO_Stub_Tact
End Enum
Private Enum XO_Mode
XO_Mode_Stop
XO_Mode_Play
End Enum
Private Const MAXNAMELEN As Long = 32
Private Type MIDIOUTCAPS
Int_Mid As Integer
Int_Pid As Integer
Lng_Version As Long
Str_Name As String * MAXNAMELEN
Int_Tech As Integer
Int_Voice As Integer
Int_Note As Integer
Int_Mask As Integer
Lng_Support As Long
End Type
Private Declare Function midiOutGetNumDevs Lib "winmm" () As Integer
Private Declare Function midiOutGetDevCaps Lib "winmm" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As MIDIOUTCAPS, ByVal uSize As Long) As Long
Private Declare Function midiOutClose Lib "winmm" (ByVal hMidiOut As Long) As Long
Private Declare Function midiOutOpen Lib "winmm" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Private Declare Function midiOutShortMsg Lib "winmm" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long
Private Declare Function timeGetTime Lib "winmm" () As Long
Private Lng_Out As Long
Private Lng_Time As Long
Private Lng_Temp As Long
Private Lng_Note As Long
Private Str_Play() As String
Private Str_List() As String
Private Str_Wave() As String
Private Lng_Wave As Long
Private Lng_List As Long
Private Str_Note As String
Private Lng_Loud As Long
Private Lng_Mode As Long
Private Byt_Note() As Byte
Private Lng_Dev As Long
Private CAP As MIDIOUTCAPS
Private Lng_Event As Long
Public Function XO_Init(Lng_Dev As Long, Lng_Init_Event As Boolean) As Long
Call XO_Close
XO_Init = midiOutOpen(Lng_Out, Lng_Dev, 0, App.hInstance, 0)
Lng_Event = Lng_Init_Event
End Function
Public Sub XO_Close()
Call XO_Stop
DoEvents
Call midiOutClose(Lng_Out)
End Sub
Public Property Get XO_Dev_Count() As Long
XO_Dev_Count = midiOutGetNumDevs - 1
End Property
Public Property Get XO_Dev(Lng_New As Long) As String
Call midiOutGetDevCaps(Lng_New, CAP, Len(CAP))
XO_Dev = CAP.Str_Name
End Property
Public Property Let XO_Dev(Lng_New As Long, Str_New As String)
Lng_Dev = Lng_New
End Property
Private Sub XO_Note(Byt_Out As Byte, Byt_Note As Byte, Byt_Vol As Byte)
Call midiOutShortMsg(Lng_Out, ("&H9" & Byt_Out) Or (Byt_Note * &H100) Or (Byt_Vol * &H10000))
If Lng_Event Then RaiseEvent Note(CLng(Byt_Note))
End Sub
Private Sub XO_Stub(Byt_Out As Byte, Byt_Note As Byte)
Call midiOutShortMsg(Lng_Out, ("&H8" & Byt_Out) Or (Byt_Note * &H100))
End Sub
Private Sub XO_Tool(Byt_Out As Byte, Byt_Note As Byte)
Call midiOutShortMsg(Lng_Out, ("&HC" & Byt_Out) Or (Byt_Note * &H100))
End Sub
Private Sub XO_Wave()
Dim Str_Plus() As String
Dim Str_More As String
If Lng_List > UBound(Str_List) Then
XO_Mode = XO_Mode_Stop
Else
Str_Plus = Split(Str_List(Lng_List), "+"
If Lng_Event Then RaiseEvent List(Lng_List, UBound(Str_Plus) + 1)
For Lng_Wave = 0 To UBound(Str_Plus)
If Lng_Wave = UBound(Str_Plus) Then
Str_More = Str_More & Str_Play(Str_Plus(Lng_Wave))
Else
Str_More = Str_More & Str_Play(Str_Plus(Lng_Wave)) & vbNewLine
End If
Next
Str_Wave = Split(Str_More, vbNewLine)
ReDim Byt_Note(UBound(Str_Wave))
For Lng_Wave = 0 To UBound(Str_Wave)
Call XO_Tool("&H" & Left(Str_Wave(Lng_Wave), 1), "&H" & Mid(Str_Wave(Lng_Wave), 2, 2))
Next
Lng_List = Lng_List + 1
End If
End Sub
Private Sub XO_Tact()
If Lng_Event Then RaiseEvent Tact((Lng_Note - 6) / 2)
For Lng_Wave = 0 To UBound(Str_Wave)
If Mid(Str_Wave(Lng_Wave), 4, 1) = XO_Stub_Tact Then
Call XO_Stub("&H" & Left(Str_Wave(Lng_Wave), 1), Byt_Note(Lng_Wave))
End If
Str_Note = Mid(Str_Wave(Lng_Wave), Lng_Note, 2)
If Not Str_Note = ".." Then
If Mid(Str_Wave(Lng_Wave), 4, 1) = XO_Stub_Note Then
Call XO_Stub("&H" & Left(Str_Wave(Lng_Wave), 1), Byt_Note(Lng_Wave))
End If
Call XO_Note("&H" & Left(Str_Wave(Lng_Wave), 1), "&H" & Str_Note, CByte(Lng_Loud))
Byt_Note(Lng_Wave) = "&H" & Str_Note
End If
Next
Lng_Note = Lng_Note + 2
If Lng_Note >= Len(Str_Wave(0)) Then
Call XO_Wave
Lng_Note = 6
End If
End Sub
Public Sub XO_Play()
Lng_List = 0
Call XO_Wave
XO_Mode = XO_Mode_Play
Lng_Note = 6
Lng_Time = timeGetTime
Do While XO_Mode
While timeGetTime - Lng_Time <= XO_Temp
DoEvents
Wend
Call XO_Tact
Lng_Time = timeGetTime
Loop
End Sub
Public Sub XO_Stop()
XO_Mode = XO_Mode_Stop
End Sub
Public Property Get XO_Temp() As Long
XO_Temp = Lng_Temp
End Property
Public Property Let XO_Temp(Lng_New As Long)
Lng_Temp = Lng_New
End Property
Public Property Get XO_Mode() As Long
XO_Mode = Lng_Mode
End Property
Public Property Let XO_Mode(Lng_New As Long)
Lng_Mode = Lng_New
End Property
Public Property Get XO_Loud() As Long
XO_Loud = Lng_Loud
End Property
Public Property Let XO_Loud(Lng_New As Long)
Lng_Loud = Lng_New
End Property
Public Property Get XO_List() As Long
XO_List = Lng_List
End Property
Public Sub XO_Load(Str_Load_List As String, Str_Load_Data As String)
Str_List = Split(Str_Load_List, ","
Str_Play = Split(Str_Load_Data, vbNewLine & vbNewLine)
End Sub
Ну думаю с загрузкой понятно.. вызываешь лоад, пихаешь туда 2 переменные, одна типа плейлист, вторая - сами данные. Ниже пример файла данных:
0001:2d..2f..30..2d..2f..30..32..2f..30..32..34..30..32..34..35..32..
1071:15..21..15..21..13..1f..13..1f..11..1d..11..1d..10..1c..10..1c..
9000:24......24......24......24......24......24......24......24......
9000:........26..............26..............26..............26......
9000:....2a......2a......2a......2a......2a......2a......2a......2a..
типа мелодя какая-то Так вот первая строчка - и есть плелист, всё остально - данные.
Номер ответа: 14
Автор ответа:
Затычкин К. И
ICQ: 457-842-713
Вопросов: 4
Ответов: 18
Профиль | | #14
Добавлено: 26.04.07 15:39
Конечно, благодарен, но для того чтобы шарить в этом коде, мне нужно видимо немного еще подучится..
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 26.04.07 15:47
шарить<>юзать_готовое
Чтобы юзать готовые, можно шарить на уровне вызовов функций/методов...