请问VB能否自编音乐

发布时间:2024-05-17 12:22 发布:上海旅游网

问题描述:

QB可以用PLAY语句编音乐,用ABCDEFG、点、L表示音调、音阶、因长等等。在VB里能不能呢?有没有这方面的控件?

问题解答:

VB中没有PLAY语句
实现VB中编音乐可以通过windows API函数实现
主要API有
midiOutGetNumDevs '得到midi设备个数
midiOutGetDevCaps '得到指定设备信息
midiOutOpen '打开迷笛以便放音
midiOutClose '关闭打开的迷笛
midiOutShortMsg '向打开的迷笛发送消息
至于如何利用它实现,我整理一下再补充
----------------------------------------
一般电脑都有默认的迷笛,现在使用默认的,所以midiOutGetNumDevs和midiOutGetDevCaps就不用了.
编程之前先把你的迷笛弄出来:
"打开音量控制"-->"属性"-->"选项"
选中单选"播放",在下面的复选栏中把"迷笛"钩上,确定,回到音量设置界面后,把迷笛的音量调到最高.
------------------------------------
VB编程:
在窗体上添加一个文本框,两个按钮,加进以下代码:
Option Explicit
Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long
Private Declare Function midiOutOpen Lib "winmm.dll" (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.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long

Dim Flip As Integer
Dim CurDevice As Long ' current midi device
Dim Hmidi As Long ' midi output 句柄
Dim Rc As Long ' return code
Dim Midimsg As Long ' 播放 message buffer
Dim sMidimsg ' 停止 message buffer
Dim Channel As Integer ' 频道
Const Volume = 127 ' 音量
Private Sub Command1_Click()
If Not IsNumeric(Text1.Text) Then MsgBox "请输入数字0-27":Exit Sub
Flip = CInt(Text1.Text)
If Flip < 0 Or Flip > 127 Then MsgBox "超出范围": Exit Sub
Midimsg = &H90 + ((Flip) * &H100) + (Volume * &H10000) + Channel
sMidimsg = &H80 + ((Flip) * &H100) + Channel
midiOutShortMsg Hmidi, Midimsg
End Sub
Private Sub Command2_Click()
midiOutShortMsg Hmidi, sMidimsg
End Sub

Private Sub Form_Load()
Channel = 0
CurDevice = -1
Rc = midiOutClose(Hmidi)
Rc = midiOutOpen(Hmidi, CurDevice, 0, 0, 0)
If (Rc <> 0) Then
MsgBox "Couldn't open midi out, rc = " & Rc
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Rc = midiOutClose(Hmidi)
End Sub
----------------------
运行示范:在文本框输入数字65,然后点击command1就会播放一个音,点击command2的话就会停止.如果不点击command2那个音就会越来越弱直至完全听不到.
因此输入不同的数字就会发出不同的音高,command2点击的快慢可以调节节拍.
其中,channel变量代表频道,取值为0-7.迷笛允许8个声音同时播放.
而且还有乐器选择,默认的乐器是"钢琴乐"
当然想实现QB里的连续发音,要对代码进一步编写,把字母映射成数字,再利用WindowsAPI函数GetTickCount实现延时.

网上有一种音乐maker源代码,可以参考一下.

至于仿QB的play源代码,(比如play "O3L8CDEFP4GAB")近期内会在我的百度空间提供...敬请关注!

热点新闻