强大的音乐乐谱控件库

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. 谱表指谱号和五线谱合称,如图所示为高音谱表(上)和低音谱表(下)。

    ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/279949.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网大为卸任腾讯CXO;Midjourney 1 月训练视频模型;2023年马斯克赚了7700亿

投融资 • 2023 年大型科技公司在生成式 AI 初创企业上的投资远超风险投资集团• 恒信东方与无锡政府合作成立布局 MR/XR 技术及 3D 数字资产 AIGC 产业投资基金• 新公司法完善注册资本认缴登记制度• 网大为卸任腾讯CXO&#xff0c;曾促成南非MIH的投资• 宁波蔚孚科技完成数…

Spring-6-事务管理

事务是构建可靠企业级应用程序的最关键部分之一。 最常见的事务类型是数据库操作。 在典型的数据库更新操作中&#xff0c;首先数据库事务开始&#xff0c;然后数据被更新&#xff0c;最后提交或回滚事务(根据数据库操作的结果而定)。但是&#xff0c;在很多情况下&#xff0…

手写Spring与基本原理--简易版

文章目录 手写Spring与基本原理解析简介写一个简单的Bean加载容器定义一个抽象所有类的BeanDefinition定义一个工厂存储所有的类测试 实现Bean的注册定义和获取基于Cglib实现含构造函数的类实例化策略Bean对象注入属性和依赖Bean的功能Spring.xml解析和注册Bean对象实现应用上下…

Y9000P + ubuntu22.04 配置Anaconda+pycharm +pytorch

Anaconda3 的安装及使用方法安装 Anaconda3 Anaconda3 是 Anaconda 的具体版本 Anaconda3 中的 Python 解释器默认使用的是 Python3.x 版本&#xff0c;而不是 Python2.x 版本 Python2.x 版本中&#xff0c;字符串是以 ASCII 编码处理的&#xff0c;而在 Python3.x 版本中&am…

软件测试/测试开发丨Python 虚拟环境及pip环境管理

venv 虚拟环境管理 venv 虚拟环境的优点 独立的 Python 环境&#xff0c;不会产生冲突有助于包的管理删除和卸载方便 venv 使用方法 创建虚拟环境 python3 -m venv test 激活虚拟环境 切换指定文件夹Windows&#xff1a;/Scripts/macOS&#xff1a;/bin/ 执行指令&#xff…

【Git】Git的基本操作

前言 Git是当前最主流的版本管理器&#xff0c;它可以控制电脑上的所有格式的文件。 它对于开发人员&#xff0c;可以管理项目中的源代码文档。&#xff08;可以记录不同提交的修改细节&#xff0c;并且任意跳转版本&#xff09; 本篇博客基于最近对Git的学习&#xff0c;简单介…

自制双色球/大乐透摇奖小程序代码

自制双色球/大乐透摇奖小程序 双色球/大乐透 双色球/大乐透等彩票摇奖深受大众彩迷的喜爱&#xff0c;但是每次摇奖的随机性总是有内部操作的空间&#xff0c;为了将降低可能存在的黑幕&#xff0c;本人自制了简单的双色球/大乐透摇奖小程序,可以供官方参考&#xff1a; def…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

【Linux驱动】设备树简介 | 内核对设备树的处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f9f2;设备树简介&#x1f3f9;设备树语法&#x1f3f9;常见节点和属性&#x1f3f9…

基于CNN神经网络的手写字符识别实验报告

作业要求 具体实验内容根据实际情况自拟&#xff0c;可以是传统的BP神经网络&#xff0c;Hopfield神经网络&#xff0c;也可以是深度学习相关内容。 数据集自选&#xff0c;可以是自建数据集&#xff0c;或MNIST&#xff0c;CIFAR10等公开数据集。 实验报告内容包括但不限于&am…

基于metersphere和supper-jacoco 测试覆盖率落地实践

一、背景及目标 背景 1、技术研发流程为测试 提供冒烟用例-开发根据用例自测-提测-开始测试&#xff0c;这一套流程&#xff0c;但是中间开发是否真实执行冒烟&#xff0c;测试并不知晓&#xff0c;而且测试提供冒烟用例是否符合标准也没法进行量化 2、公司产品属于saas产品&…

从0开始界面设计师 Qt Designer

QT程序界面的 一个个窗口、控件&#xff0c;就是像上面那样用相应的代码创建出来的。 但是&#xff0c;把你的脑海里的界面&#xff0c;用代码直接写出来&#xff0c;是有些困难的。 很多时候&#xff0c;运行时呈现的样子&#xff0c;不是我们要的。我们经常还要修改代码调整界…

2023年的Android开发:演进之年

2023年的Android开发&#xff1a;演进之年 在2023年&#xff0c;安卓开发迎来了许多新功能和里程碑&#xff0c;让我们来看看其中的一些关键功能。 Jetpack Compose 1.5.7 Jetpack Compose是一个用于构建安卓用户界面的工具&#xff0c;从Jetpack Compose 1.0到Jetpack Comp…

GBASE南大通用-GBase 8s分片表操作 提升大数据处理性能

目录 一、GBase 8s分片表的优势 二、六种分片方法 轮转 1.轮转法 基于表达式分片 2.基本表达式 3.Mod运算表达式 4.Remainder关键字方式 5.List方式 6.interval 固定间隔 三、分片表的索引 1.创建索引的注意事项 2.detach索引替代delete功能展现 3.在现有分片表上增加一个新…

C语言之指针和数组

指针和数组虽然是不同的东西&#xff0c;但却有着千丝万缕的关系&#xff0c;下面就让我们逐一了解吧&#xff01; 指针和数组 数组名原则上会被解释为指向该数组起始元素的指针。 也就是说。如果a是数组&#xff0c;那么表达式a的值就是a[0]的值&#xff0c;即与&a[0]一…

TikTok真题第9天 | 163.缺失的区间、1861.旋转箱子、2217.找到指定长度的回文数

163.缺失的区间 题目链接&#xff1a;163.missing-ranges 解法&#xff1a; 基本逻辑是&#xff0c;依次遍历nums中的所有的元素&#xff0c;判断这个元素&#xff08;right&#xff09;和上一个元素&#xff08;left&#xff09;的差值是否>2&#xff0c;如果是&#xf…

Cisco模拟器-跨交换机实现VLAN

计要求将两台相互连接的交换机上的VLAN号全局使用&#xff0c;技术上可以使用TRUNK技术的数据包标记功能来实现。 通过设计&#xff0c;可以对多台交换机进行整合&#xff0c;提高网络设备的利用率、降低网络工程的成本&#xff0c;同时也可以简化网络配置。 交换机0配置&…

【privateGPT】使用privateGPT训练您自己的LLM

了解如何在不向提供商公开您的私人数据的情况下训练您自己的语言模型 使用OpenAI的ChatGPT等公共人工智能服务的主要担忧之一是将您的私人数据暴露给提供商的风险。对于商业用途&#xff0c;这仍然是考虑采用人工智能技术的公司最大的担忧。 很多时候&#xff0c;你想创建自己…

.FileZilla的使用和主动模式被动模式介绍

FileZilla的使用和主动模式被动模式介绍 1.FileZilla的使用和主动模式被动模式介绍1.安装下载2.新建组和用户2.1打开后出现如下界面2.2点击编辑打开组这个选项2.3点击添加组以后&#xff0c;点击确认2.4输入组的名称&#xff0c;列如我输入的niyin2.5点击用户选项2.6像上面一样…