强大的音乐乐谱控件库

2023-12-30 12:20
文章标签 音乐 强大 控件 乐谱

本文主要是介绍强大的音乐乐谱控件库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2023 Conmajia, 2018 Ajcek84
SN: 23C.1
本中文翻译已获原作者首肯。

简介

PSAM 控件库——波兰音乐文档系统——是用于显示、排版乐谱的强大 WinForm 库,包含用于绘制乐谱的名为 IncipitViewer 控件,乐谱内容可以从 MusicXml 文件读取,或者在程序中添加赋格、音符、小节等。这个控件是为 PSAM 软件(图 1)而开发的组件。当我意识到其他软件开发者也许可能想要用到它的功能,我决定在 BSD 许可下发布这个控件。PSAM 控件库完全由 C# 实现。

图 1. PSAM 系统截图,演示了多个 IncipitViewer 的显示效果

使用代码

IncipitViewer 控件需要特殊的音乐字体来绘制音符等。本文提供的下载资源中附带了 Polihymnia 的 TrueType 字体,以便你可以直接安装使用。这个字体基于 Ben Laenen 的 Euterpe 字体,以 Sil 开放字体许可发布。

IncipitViewer(PSAMControlLibrary.dll)是标准的 C# 控件库。将其简单拖放至 Visual Studio 窗体设计器工具箱即可开始使用。控件用法类似普通控件,如 TextBox 等。若是用编程方式创建 IncipitViewer 控件,使用如下代码。

IncipitViewer viewer = new IncipitViewer();
viewer.Dock = DockStyle.Fill;
Controls.Add(viewer);

一般来说 Visual Studio 会自动添加

using PSAMControlLibrary;

本控件提供了从 MusicXML 文件读取乐谱的功能——仅限第一行谱表1,忽略后续谱表。

viewer.LoadFromXmlFile("example.xml");

从文件读取并显示乐谱效果如下。

图 2. 使用 IncipitViewer 显示 MusicXML 文件内容

使用 ClearMusicalIncipit() 方法可清除当前显示内容。

本控件提供了代码用于以编程方式添加音符等内容。例如,下面的代码向乐谱第 2 行添加了一个 G 谱号。

Clef c = new Clef(ClefType.GClef, 2);
viewer.AddMusicalSymbol(c);

以及一个新的 G 调四分音符(1=G4/4)。

Note n = new Note("G", 0, 4, MusicalSymbolDuration.Quarter,NoteStemDirection.Up, NoteTieType.None,new List<NoteBeamType>() {NoteBeamType.Single});
viewer.AddMusicalSymbol(n);

音符(Note)构造函数的第一个参数键名(A, B, C, D, E, F, G),第二个参数是升调数(+)或降调数(-)。升降调若为 0 则表示原调。第三个参数是八度。接下来的参数有:音符节拍、音杆方向和延音线类型(如果没有则为 NoteTieType.None)。最后一个参数是符杠列表。如果音符没有任何符杠,即使音符的持续时间大于八分音符,仍然需要有这个列表,只是里面仅有一个元素 NoteBeamType.Single。为了清楚地说明符杠列表是如何工作的,下面的代码将尝试添加一个由两个十六分音符和一个八分音符组成的组:

Note s1 = new Note("A", 0, 4, MusicalSymbolDuration.Sixteenth, NoteStemDirection.Down, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Start, NoteBeamType.Start});
Note s2 = new Note("C", 1, 5, MusicalSymbolDuration.Sixteenth, NoteStemDirection.Down, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Continue, NoteBeamType.End });
Note e = new Note("D", 0, 5, MusicalSymbolDuration.Eighth, NoteStemDirection.Down, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.End });
viewer.AddMusicalSymbol(s1);
viewer.AddMusicalSymbol(s2);
viewer.AddMusicalSymbol(e);

显示的乐谱如下。

如果设置符杠为 NoteBeamType.Single,则乐谱如下。

本控件还支持彩色音符,只需要简单地修改音符 MusicalCharacterColor 属性。

尽管 IncipitViewer 只支持单谱表,但它依然支持和弦,因为它们是许多单声部乐器习惯用法的一部分。如果一个音符的 IsChordElement 属性设置为 true,那么它就被视为前一个音符的和弦元素:

Note n1 = new Note("C", 0, 4, MusicalSymbolDuration.Half, NoteStemDirection.Up, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Single });
Note n2 = new Note("E", 0, 4, MusicalSymbolDuration.Half, NoteStemDirection.Up, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Single });
Note n3 = new Note("G", 0, 4, MusicalSymbolDuration.Half, NoteStemDirection.Up, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Single });
n2.IsChordElement = true;
n3.IsChordElement = true;viewer.AddMusicalSymbol(n1);
viewer.AddMusicalSymbol(n2);
viewer.AddMusicalSymbol(n3);

结果如下。

下面的代码演示了点、休止符和小节符。

Note n4 = new Note("A", 0, 4, MusicalSymbolDuration.Half,NoteStemDirection.Up, NoteTieType.None,new List<NoteBeamType>() { NoteBeamType.Single });
n4.NumberOfDots = 1;
Rest r = new Rest(MusicalSymbolDuration.Quarter);
Barline b = new Barline();
viewer.AddMusicalSymbol(n4);
viewer.AddMusicalSymbol(r);
viewer.AddMusicalSymbol(b);

结果如下。

鼠标互动

当鼠标悬停在控件上时,右上角会出现两个按钮:第一个用于保存与控件关联的 MusicXml 文件,第二个用于调用 OnPlayExternalMidiPlayer 事件处理程序,用法如下。

viewer.PlayExternalMidiPlayer += new IncipitViewer.PlayExternalMidiPlayerDelegate(viewer_PlayExternalMidiPlayer);
void viewer_PlayExternalMidiPlayer(IncipitViewer sender) {//Place your code here
}

借此,你可以用代码从已有控件读出音符,并用自定义代码或是其他第三方库播放。IncipitViewer.IncipitElement(int i) 方法可以读取第 i 个音符,而 MusicalSymbol.ToMidiPitch() 方法则可以将空间中的音符转换为 MIDI。

要打印 IncipitViewer 控件的内容,创建一个 PrintDocument 对象并处理其 PrintPage 事件。

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) {Graphics g = e.Graphics;viewer.DrawViewer(g, true);
}

接下来调用 Print() 方法打印音乐文档。

PrintDialog dlg = new PrintDialog();
dlg.Document = printDocument1;
if (dlg.ShowDialog() == DialogResult.OK) {printDocument1.Print();
}

打印样张如下。

许可

本文及其附属文件、代码均以 BSD 协议发布。


  1. 谱表指谱号和五线谱合称,如图所示为高音谱表(上)和低音谱表(下)。

    ↩︎

这篇关于强大的音乐乐谱控件库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/552833

相关文章

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

IntelliJ IDEA - 强大的编程工具

哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你的工作效率翻倍?是智能的代码编辑器,强大的版本控制工具,还是那些让你事半功倍的自动化脚本?在这里我推荐一款好用的编程工具:IntelliJ IDEA。 方向一:工具介绍 Int

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

最强虚拟机,内置强大插件,绝!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 天给大家安利两款移动端的虚拟机软件,均支持超级权限、Xposed框架和谷歌服务,而其中一款可谓称得上最强虚拟机,不仅含有虚拟机的基本功能,还能多开分身、模拟器以及强大的插件社区,能实现的功能超乎你的想象,一起来看看吧! X8沙箱(安卓) 软件介绍 X8沙箱(手机版的安卓模拟器、虚拟机、多开分身、游戏双开多开挂机)是一款极简、

推荐一款强大的OCR软件,请低调使用!

今天给大家分享一款开源的OCR识别软件,可以提升大家的办公效率——Umi-OCR,支持window​和Linux系统。 Umi-OCR支持提取一张图片或者多张图片的信息,只需通过右边的功能页选择相应的功能。 点击左边的“截图OCR”进入页面 点击“截图”按钮选取截图区域,直接在右边的记录中​提取出截图中的信息。 批量OCR功能也一样,点击左边菜单的“批量OCR”菜单