当前位置: 首页 > news >正文

强大的音乐乐谱控件库

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

    ↩︎

相关文章:

强大的音乐乐谱控件库

2023 Conmajia, 2018 Ajcek84 SN: 23C.1 本中文翻译已获原作者首肯。 简介 PSAM 控件库——波兰音乐文档系统——是用于显示、排版乐谱的强大 WinForm 库&#xff0c;包含用于绘制乐谱的名为 IncipitViewer 控件&#xff0c;乐谱内容可以从 MusicXml 文件读取&#xff0c;或者…...

数据库——简单查询复杂查询

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;…...

java虚拟机内存管理

文章目录 概要一、jdk7与jdk8内存结构的差异二、程序计数器三、虚拟机栈3.1 什么是虚拟机栈3.2 什么是栈帧3.3 栈帧的组成 四、本地方法栈五、堆5.1 堆的特点5.2 堆的结构5.3 堆的参数配置 六、方法区6.1 方法区结构6.2 运行时常量池 七、元空间 概要 根据 JVM 规范&#xff0…...

Hive实战:词频统计

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、基于HDFS文件创建外部表4、查询单词表&a…...

FairyGUI-Cocos Creator官方Demo源码解读

博主在学习Cocos Creator的时候&#xff0c;发现了一款免费的UI编辑器FairyGUI。这款编辑器的能力十分强大&#xff0c;但是网上的学习资源比较少&#xff0c;坑比较多&#xff0c;主要学习方式就是阅读官方文档和练习官方Demo。这里博主进行官方Demo的解读。 从gitee上克隆项目…...

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…...

【Linux】指令(本人使用比较少的)——笔记(持续更新)

文章目录 ps -axj&#xff1a;查看进程ps -aL&#xff1a;查看线程echo $?&#xff1a;查看最近程序的退出码jobs&#xff1a;查看后台运行的线程组fd 任务号&#xff1a;将后台任务提到前台bg 任务号&#xff1a;将暂停的后台程序重启netstat -nltp&#xff1a;查看服务及监听…...

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…...

轮廓检测与处理

轮廓检测 先将图像转换成二值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 ret, thresh cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 变为二值&#xff0c;大于127置为255&#xff0c;小于100置为0.使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.…...

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…...

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…...

GLTF编辑器-位移贴图实现破碎的路面

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种可以用于增加模型细节和形状的贴图。它能够在渲染时针…...

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-BiLSTM麻雀算法优化…...

docker安装Nacos和Rabbitmq

一、安装Nacos 首先需要拉取对应的镜像文件&#xff1a;&#xff08;切换版本加上对应版本号即可&#xff0c;默认最新版&#xff09; docker pull nacos/nacos-server 接着挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p …...

Android MVC 写法

前言 Model&#xff1a;负责数据逻辑 View&#xff1a;负责视图逻辑 Controller&#xff1a;负责业务逻辑 持有关系&#xff1a; 1、View 持有 Controller 2、Controller 持有 Model 3、Model 持有 View 辅助工具&#xff1a;ViewBinding 执行流程&#xff1a;View >…...

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…...

js for和forEach 跳出循环 替代方案

1 for循环跳出 for(let i0;i<10;i){if(i5){break;}console.log(i) }在函数中也可以return跳出循环 function fn(){for(let i0;i<10;i){if(i5){return;}console.log(i)} } fn()for ... of效果同上 2 forEach循环跳出 break会报错 [1,2,3,4,5,6,7,8,9,10].forEach(i>…...

如何使用ArcGIS Pro自动矢量化建筑

相信你在使用ArcGIS Pro的时候已经发现了一个问题&#xff0c;那就是ArcGIS Pro没有ArcScan&#xff0c;在ArcGIS Pro中&#xff0c;Esri确实已经移除了ArcScan&#xff0c;没有了ArcScan我们如何自动矢量化地图&#xff0c;从地图中提取建筑等要素呢&#xff0c;这里为大家介绍…...

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…...

41.坑王驾到第七期:uniapp开发微信小程序引用组件时报错!

一、错误再现 页面login引用了一个组件register&#xff0c;运行至小程序开发工具报错。 xxx.js 已被代码依赖分析忽略&#xff0c;无法被其他模块引用。 二、解决办法 在微信小程序的配置文件中找到setting节点&#xff0c;增加两个配置项。 “ignoreDevUnusedFiles”: fa…...

Informer实战指南:从ProbSparse自注意力到生成式解码器的长序列预测优化

1. Informer模型的核心突破&#xff1a;为什么比Transformer更适合长序列预测&#xff1f; 第一次看到Informer论文时&#xff0c;最让我惊讶的是它在AAAI 2021上击败了众多Transformer变体获得最佳论文。这个专为长序列预测&#xff08;Long Sequence Time-series Forecasting…...

ofa_image-caption生产环境部署:支持批量图片处理与结果导出的企业方案

ofa_image-caption生产环境部署&#xff1a;支持批量图片处理与结果导出的企业方案 1. 项目背景与核心价值 在实际的企业应用中&#xff0c;图像内容理解已经成为许多业务场景的必备能力。无论是电商平台的商品图片描述生成&#xff0c;还是内容平台的海量图片标注&#xff0…...

微信JS-SDK分享失败?深度解析“offline verifying”权限验证错误与高效排查指南

还在为微信网页自定义分享功能频繁遭遇“updateAppMessageShareData:fail, the permission value is offline verifying”而头疼&#xff1f;本文将从公众号认证、JS-SDK权限、域名绑定、网络、缓存及API版本六大维度&#xff0c;为您深度剖析此错误成因&#xff0c;并提供一套…...

Simple Runtime Window Editor:突破窗口分辨率限制的技术实现与应用指南

Simple Runtime Window Editor&#xff1a;突破窗口分辨率限制的技术实现与应用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 一、场景化问题诊断&#xff1a;分辨率调整的现实挑战 1.1 专业设计工作流的…...

3分钟搞定!LyricsX让你的macOS音乐播放器拥有完美歌词体验

3分钟搞定&#xff01;LyricsX让你的macOS音乐播放器拥有完美歌词体验 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为macOS上的音乐播放器找不到合适的歌词而烦恼吗&#xff1f;L…...

技术揭秘:深入解析Universal-IFR-Extractor固件逆向工程工具

技术揭秘&#xff1a;深入解析Universal-IFR-Extractor固件逆向工程工具 【免费下载链接】Universal-IFR-Extractor Utility that can extract the internal forms represenation from both EFI and UEFI modules. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-IF…...

C++/Qt 使用 Tushare 获取股票信息

探索数据之源&#xff1a;使用tushare为Qt/C学习项目获取股票数据在进行金融量化分析或学习金融市场行为时&#xff0c;获取高质量、结构化的股票数据是至关重要的第一步。作为一个计划将Qt/C用于金融数据可视化或策略模拟的学习者&#xff0c;我近期深入体验了使用Python库tus…...

从卡顿到实时:Shenyu网关WebSocket通知系统如何解决微服务配置同步难题

从卡顿到实时&#xff1a;Shenyu网关WebSocket通知系统如何解决微服务配置同步难题 你是否遇到过这样的困境&#xff1a;API网关配置更新后&#xff0c;客户端需要等待数分钟甚至更长时间才能生效&#xff1f;在秒杀活动等高并发场景下&#xff0c;这种延迟可能导致流量分配不…...

探索Comsol在光子晶体光纤SPR - PCF传感器及光学仿真中的奇妙世界

Comsol光子晶体光纤spr pcf传感器comsol光 Comsol光子晶体光纤spr pcf传感器 comsol光学仿真spr。 利用几何相位缺陷态光子晶体实现谷自旋分离在光学领域&#xff0c;光子晶体光纤&#xff08;PCF&#xff09;以及表面等离子体共振&#xff08;SPR&#xff09;相关的研究一直热…...

3大创新突破:FlashPatch如何让Flash内容重获新生

3大创新突破&#xff1a;FlashPatch如何让Flash内容重获新生 【免费下载链接】FlashPatch FlashPatch! Play Adobe Flash Player games in the browser after January 12th, 2021. 项目地址: https://gitcode.com/gh_mirrors/fl/FlashPatch 如何解决2021年后Flash内容无…...