学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> VB >> 利用VB6.0实现五线谱作曲工具


利用VB6.0实现五线谱作曲工具


  摘 要 针对数字化音乐教学的需要,提出了基于VB环境开发五线谱作曲工具的可行性,并对其中技术原理、关键问题给出了具体的解决方法,实现了一个基本的可视化作曲工具,对一般音乐教育工作者具有很好的启发性。

  关键词 数字化音乐;五线谱;音乐软件

  目前在数字化音乐教学过程中需要用到许多编辑软件和作曲软件。许多音乐教育工作者对如何开发自己的数字音乐工具很感兴趣,而一般的计算机类书刊对此类问题探讨和介绍的比较少,本文试图从这一领域做些原理性的研究工作,以供音乐教育工作者和其他相关爱好者发挥、扩展,起到抛砖引玉的作用。因此本文以业余程序员最熟悉的开发工具VB为平台,开发设计了一个基本的五线谱编辑工具,并实现了数字音乐的合成、播放、保存和读写。

  可视化图形界面的设计

  首先在VB环境中建立一个新的窗体并保存,然后在窗体中建立菜单和工具条,为简便起见,工具条用Option控件组来实现(需要把风格设为Graphical模式),并把事先做好的图标加载到控件上。图1是五线谱作曲工具的主界面,其中Picture1控件作为可视化编辑工具的客户操作区,Picture2控件中所加载的位图包含了作曲过程中需要的基本音符,在操作过程中通过位图提取的方式来获得相应的音符,然后插入到所需的位置。

  

  图1 VB环境中的设计界面

  五线谱作曲功能的实现

  在工具条上的五个Option控件构成一个控件组,根据Option控件本身的特性,其中一个选中时其它的自动设为非选择项,因此操作起来很方便。当选中其中的一个音符图标后,自动触发相应的事件。事件处理代码如下:

Private Sub Option1_Click(Index As Integer)
 Picture1.SetFocus ‘ 焦点集中到客户区
 Yinfu = Index ‘ 获得音符序号
End Sub


  其中整型数Yinfu是一个全局变量,通过控件组中的索引Index可以知道哪个音符按钮被选中。为了记录作曲过程中的操作,定义一个二维数组Music用来存放数据,光标点取在Picture1客户区中的坐标经过圆整后作为数组的行、列序号,数组元素记录所选的音符。整个处理过程放在Picture1控件的MouseDown事件中进行,代码如下:

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 Dim LineY&, ColoumX&
 LineY& = Round((Y - 13) / 5) ‘行圆整
 ColoumX& = Round((X - 30) / 16) ‘列圆整
 If Not (ColoumX& > 0 And LineY& > 0) Then
  Exit Sub
 End If
 If Music(LineY&, ColoumX& + HScroll1.Value) = 0 Then
  Music(LineY&, ColoumX&
  + HScroll1.Value) = Selection ‘ 记录音符
 End If
 DisplayNotes ‘在客户区显示当前音符
End Sub

  当程序运行时,首先通过主窗体的Form Load事件在Picture1的客户区绘出五线谱的五条平行的水平线,作曲者便可以根据不同的音高在相应位置插入音符。插入音符的过程是通过上面的DisplayNotes函数来实现的,利用Windows系统的API(应用程序接口)函数Bitblt所具有的内存数据传送的功能将Picture2中位图的一部分提取出来并按照一定的变换后插入到Picture1的客户区制定位置,主要代码如下:

Select Case ID
 Case 1
  BitBlt Picture1.hdc, X& - 7, Y& - 18, 20, 30, Picture2.hdc, 66, 0, SRCAND
 Case 2
  BitBlt Picture1.hdc, X& - 5, Y& - 18, 20, 30, Picture2.hdc, 0, 0, SRCAND
  …

  

  图2 五线谱作曲工具的运行效果

  曲谱的保存和读取

  在可视化编辑工具中所作的曲目应当能够保存为数据文件。保存和读取的操作是通过通用对话框CommonDialog来实现的,设计程序界面时在窗体上加载一个通用对话框控件。当点取程序菜单上的“保存”时,弹出文件保存对话框,然后设置文件路径对音乐数据进行保存,其代码如下:

CommonDialog1.FileName = App.Path & "\*.txt"
CommonDialog1.ShowOpen ‘显示保存对话框
If CommonDialog1.FileName = App.Path & "\*.txt" Then Exit Sub
 Me.MousePointer = 11
 For LineY& = 1 To 40
  OutputS = "Tone" & LeadingZeros$(LineY&, 2) & ": "
  For ColoumX = 1 To 150
   A = Chr(Music(LineY&, ColoumX) + Asc("0"))
   OutputS = OutputS & A ‘写入文件
  Next ColoumX
  Whole$ = Whole$ & OutputS & vbCrLf
  Next LineY
  Open CommonDialog1.FileName For Output As #1
  Print #1, Whole$
  Close #1 ‘关闭文件

  文件的读取过程与保存过程类似,只要通过Input语句将文件中的数据加载到二维数组Music中去就可以了。

  曲谱的合成与播放

  曲谱的合成是通过Windows自带的多媒体API函数来实现的,这些API函数在winmm.dll文件中,因此需要把该文件引用到程序中。该动态链接库中包含了多个数字音乐(Midi)输入、输出、合成等方面的库函数。在对曲谱进行Midi合成播放时,首先将二维数组Music中的数据转化为数字音频信号,然后通过计算机的声卡播放出来,其中的关键代码如下:

For LineY& = 1 To 30
 If Music(LineY&, X) <> 0 And Not ISAgainFlag Then
  midimsg = &H90 + ((46 + LineY&) * &H100) + (volume * &H10000) + TempChannel ‘定义音高
  midiOutShortMsg hmidi, midimsg ‘输出音频
 End If
Next LineY

  结束语

  本文介绍了一种利用VB环境实现五线谱作曲的可视化编辑工具,目的在于探讨数字音乐技术的基本原理。从功能上说这还是一个原型系统,在此基础上还可进一步扩展功能,如多行编辑、音色选择、乐器选择等。

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

真妙
...
游客 发表于2008-4-9 19:12:33
对"利用VB6.0实现五线谱作曲工具"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 利用VB6.0实现五线谱作曲工具 相关内容
Google搜索中 利用VB6.0实现五线谱作曲工具 相关内容
雅虎中 利用VB6.0实现五线谱作曲工具 相关内容
Sogou搜索中 利用VB6.0实现五线谱作曲工具 相关内容

相关软件 最新回复帖子:

·利用VB6.0实现五线谱作曲工具
·从Coreldraw提取cdr文件缩略图查看功能
·Excel表格导入Coreldraw的方法和处理技巧
·Illustrator实例:矢量标志绘制
·DW Ultradev打造留言本(一)
·用Illustrator封套快速制作时装广告
·DW Ultradev打造留言本(二)
·nesox让电子邮件营销原来如此轻松!
·三维虚拟跑车大制作
·VB中使用WinSock控件编写网络程序


  相关软件 利用VB6.0实现五线谱作曲工具相关文章
Visual Basic应用程序的几种打印方法 用VB建立字符界面的控制台程序
通信控件MSComm使用详解 VB实现动态调用含DateTime类型存储过程
VB+Access设计图书管理系统 如何用Visual Basic编写病毒
用VB6.0在Vista下实现全磨砂玻璃窗口 VB中调用MSN 6.2 API函数
Visual Basic中实现带预览的对话框 VB访问SQL Server数据库技术全揭密
用Visual Basic实现点对点通讯 Visual baisc中Byval与Byref的区别
VB6.0中Dir()函数的使用方法 VB中使用WinSock控件编写网络程序
VB程序中用ADO对象动态创建数据库和表 掌握VB中的ADO数据对象编程
用VB6.0实现网络实时监控系统 Visual Basic6.0事件机制分析
好文回顾:Visual Basic 十年风云 对VB6的后期绑定和前期绑定的一点看法