воспроизведение midi файлов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
кофейник
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 13.06.2003 (Пт) 18:50

воспроизведение midi файлов

Сообщение кофейник » 27.09.2003 (Сб) 13:19

Помогите пожалуйста новичку в следующем вопросе:
Сделал я форму с двумя кнопками Command1 и Command2
Задумка в том чтобы при нажатии на кнопку Command1 начинал проигрываться файл 1.mid, а при нажатии на Command2 либо закрытии формы воспроизведение прекращалось. При этом при загрузке формы доступна только Command1, и при нажатии на Command1 она становиться недоступной, но становиться доступной Command2
В итоге написал я вот такой код:

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Private Sub Command1_Click()
Const m_MIDI = "1.mid"
Const m_MIDIAlias = "MyFile"
sndPlaySound "1.mid", 1
mciSendString "OPEN " + m_MIDI + " TYPE SEQUENCER ALIAS " + m_MIDIAlias, 0&, 0, 0
mciSendString "PLAY " + m_MIDI + " FROM 0", 0&, 0, 0
mciSendString "CLOSE ANIMATION", 0&, 0, 0
Command1.Enabled = False
Command2.Enabled = True
End Sub

Private Sub Command2_Click()
Const m_MIDI = "1.mid"
Const m_MIDIAlias = "MyFile"
sndPlaySound "1.mid", 1
mciSendString "OPEN " + m_MIDI + " TYPE SEQUENCER ALIAS " + m_MIDIAlias, 0&, 0, 0
mciSendString "STOP " + m_MIDI, 0&, 0, 0
mciSendString "CLOSE ANIMATION", 0&, 0, 0
Command2.Enabled = False
Command1.Enabled = True
End Sub

Private Sub Form_Load()
Command2.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
Const m_MIDI = "1.mid"
Const m_MIDIAlias = "MyFile"
sndPlaySound "1.mid", 1
mciSendString "OPEN " + m_MIDI + " TYPE SEQUENCER ALIAS " + m_MIDIAlias, 0&, 0, 0
mciSendString "STOP " + m_MIDI, 0&, 0, 0
mciSendString "CLOSE ANIMATION", 0&, 0, 0
End Sub

В итоге все вроде бы работает. Однако, проблема в следующем. Когда я нажимаю на Command2 воспроизведение музыки прекращается, однако когда я после этого не закрывая формы нажимаю на Command1 то воспроизведение снова не начинается, и комп. зависает
Вопросы:
1. Почему это происходит?
2. Как это устранить, то есть сделать так, чтобы при нажатии на Command1 музыка начинала играть, после нажатия на Command2 воспроизведение останавливалось, после чего при нажатии на Command1 начинала играть снова.

По возможности дайте ответ более «разжованный» так как я новичок и многих аспектов VB еще не знаю.
Заранее благодарю.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: воспроизведение midi файлов

Сообщение Vovik » 28.09.2003 (Вс) 10:42

У меня есть пример проги для проигрывания миди, но она работает через DirectX 7.... Если хошь, я могу скинуть на мыло!

кофейник
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 13.06.2003 (Пт) 18:50

Сообщение кофейник » 28.09.2003 (Вс) 11:30

Да если можно
rtuu@rambler.ru
спасибо!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 28.09.2003 (Вс) 12:37

кофейник писал(а):Да если можно
спасибо!

Конечно мона!!! Даже нуна... :wink:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.09.2003 (Вс) 13:16

'А зачем DirectX :?: :roll:

'На форме 2 CommandButton
Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uRetrunLength As Long, ByVal hwndCallback As Long) As Long

Private Sub Command1_Click()
'Playing
Call mciSendString("play midi1", 0, 0, 0)
Command2.Enabled = True
Command1.Enabled = False
End Sub

Private Sub Command2_Click()
Command2.Enabled = False
Command1.Enabled = True
'Stopping
Call mciSendString("stop midi1", 0, 0, 0)
End Sub

Private Sub Form_Load()
'Opening
Call mciSendString("open C:\midi_file.mid type sequencer alias midi1", 0, 0, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
'Stopping & Closing
Call mciSendString("stop midi1", 0, 0, 0)
Call mciSendString("close midi1", 0, 0, 0)
End Sub

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 28.09.2003 (Вс) 16:32

Кстати, если через DirectX, то у меня есть небольшая компонента, которая это дело облегчает (там Direct Sound и Direct Music можно юзать). Тока писала для себя и она немного сырая. Но если хочешь, могу дать.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.09.2003 (Вс) 16:42

А всё-таки, зачем DirectX, если можно проще?

Возможно, в приложении (скажем, DirectX игре) будет целесообразнее использовать методы DX, но где компьютер более "свободен" по части ресурсов? Мне кажется, методы API более быстры и менее ресурсоёмки... Подскажите, профессионалы! Может, кто-нибудь тест проведёт, а?

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 28.09.2003 (Вс) 16:47

А ты хоть раз пробывал одновременно воспроизводить 3-4 миди (или wav) файла через API? У меня не получилось... Для этого -то как раз Direct Sound и Direct Music и юзают.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.09.2003 (Вс) 16:53

Несколько wav'ов у меня получалось, с midi не пробовал...

Кстати, если не трудно, выложи здесь исходник на DX или кинь на мыло svinets@rambler.ru :roll:

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 28.09.2003 (Вс) 17:10

Тут 2 архива - один исходник (только проект я не нашла - только сам ctl файл). А второй компонетта - может кому пригодится, там краткая справка есть.
Вложения
DXObjects.rar
(11.13 Кб) Скачиваний: 59
DXObjects_sourse.rar
(1.14 Кб) Скачиваний: 62

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 28.09.2003 (Вс) 19:32

Спорьте, не спорьте, а DirectX - FOREVER :!: :!: :!:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 28.09.2003 (Вс) 21:58

Ого, какие жаркие дебаты! У меня проблема чуть в другом:
Если запущен WinAmp, то при попытке запуска проги с DirectSound система стает колом ...

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 29.09.2003 (Пн) 11:33

А какой у тебя WinAmp и система какая? У меня все нормально.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 29.09.2003 (Пн) 12:09

Хм...странно...и у меня всё работает...

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.09.2003 (Вт) 17:58

У меня VinAmp 3.0 beta , Win98, Creative 128. Правда, я не уверен, что в проге абсолютно все правильно.

кофейник
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 13.06.2003 (Пт) 18:50

Сообщение кофейник » 01.10.2003 (Ср) 18:36

Amed и Vovik спасибо оба Ваши совета работают!
Все отлично, спасибо за помощь.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 02.10.2003 (Чт) 9:15

У Винампа, есть различные плагини воспроизведения :wink:
Один из них DirectSound...
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 02.10.2003 (Чт) 13:09

кофейник писал(а):Amed и Vovik спасибо оба Ваши совета работают!
Все отлично, спасибо за помощь.

Не стоит.... :lol: Если что, обращайся... :wink:

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 05.10.2003 (Вс) 19:17

Люди ПАМАГИТЕ !!! :!: :!: :!:

Вот как описано тут, все просто супер работает
Private Sub Command1_Click()
'Playing
Call mciSendString("play midi1", 0, 0, 0)
Command2.Enabled = True
Command1.Enabled = False
End Sub

Private Sub Command2_Click()
Command2.Enabled = False
Command1.Enabled = True
'Stopping
Call mciSendString("stop midi1", 0, 0, 0)
End Sub

Private Sub Form_Load()
'Opening
Call mciSendString("open C:\midi_file.mid type sequencer alias midi1", 0, 0, 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
'Stopping & Closing
Call mciSendString("stop midi1", 0, 0, 0)
Call mciSendString("close midi1", 0, 0, 0)
End Sub


Только единственная проблема. Если в пути файла (в имени папки) есть пробел то оно отказывается проигрывать файл!!!

Что делать???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.10.2003 (Пн) 5:28

А не заключить ли этот путь в кавычки?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 07.10.2003 (Вт) 22:37

Пишет - синтаксис эрор!!! Народ ну должен же быть какой то способ???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2003 (Ср) 10:21

Бейсик пишет? Так кавычки как вставляются в строку?! Парами!!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 08.10.2003 (Ср) 18:21

Если пишешь вот так
Call mciSendString("open "c:\midi_file.mid" type sequencer alias midi1", 0, 0, 0)

то пишет синтакси эррор. Т.е. пишешь кавычки вокруг пути и имени файла.
Но я кажется нашел как обойти это бяку. Можно переписать файл и директории программы в c:\ и такой путь не будет содержать пробелов.
Но более грамотно будет переписать этот файл во времменую папку виндовз. Остаётся только 1 вопрос. Как узнать имя и путь времменой папки.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.10.2003 (Ср) 18:23

:lol: могу посоветовать также просто писать 2 кавычки подряд, говорят, помогает :lol:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 08.10.2003 (Ср) 18:28

А
Код: Выделить всё
Call mciSendString("open " & Chr(34) & "c:\midi_file.mid" & Chr(34) & " type sequencer alias midi1", 0, 0, 0)

не подойдёт?
Нет меня больше

GreenT
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 17.08.2003 (Вс) 13:42

Сообщение GreenT » 08.10.2003 (Ср) 19:21

Супер
Код: Выделить всё
Private Sub Form_Load()
temp = "open " + Chr(34) + "c:\t emp\kolobki.mid" + Chr(34) + " type sequencer alias midi1"
Call mciSendString(temp, 0, 0, 0)
End Sub

Вот так работает даже если пробел есть.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 33

    TopList