介绍
更新:这篇文章描述了一位老人。NET项目,最终演变为更大的开源框架Manufaktura。控制。你可以在这里阅读:https://www.codeproject.com/Articles/1252423/Music-Notation-in-NET
PSAM控制库是一个WinForms库,包含IncipitViewer(初始查看器)
用于绘制可从中读取的音符的控件音乐XML文件或以编程方式添加。该图书馆最初是大型软件波兰音乐档案系统的组成部分(http://www.archiwistykamuzyczna.pl/?lang=en)但我认为它可能对其他软件开发人员有用,所以我决定根据BSD许可证发布它。PSAM控制库是在Microsoft Visual Studio Express下用C#编写的。
以下屏幕说明了许多IncipitViewer(初始查看器)
手稿数据库应用程序中的控件:
PSAM Control Library官方网站位于http://musicengravingcontrols.com/.
使用代码
Incipit查看器
控件需要特殊的字体来绘制注释和其他音乐符号。您可以创建自己的字体或使用包含的字体Polihymnia,该字体基于Ben Laenen的Euterpe字体,并在Sil Open font Licence下分发。当然,您必须在字体目录中安装字体才能正确显示注释。
最简单的添加方式IncipitViewer(初始查看器)
对项目的控制是拖放PSAM控制库.dll文件到您的工具箱
然后拖放IncipitViewer(初始查看器)
控件。您也可以创建IncipitViewer(初始查看器)
以编程方式控制,例如:
IncipitViewer查看器=新的IncipitViewer();查看器。Dock=DockStyle。填充;控制。添加(查看器);
记住添加使用PSAMControlLibrary;
对代码的指令。
从中读取音乐音乐XML文件使用LoadFromXmlFile(字符串文件名)
方法,并键入要打开的XML文件的路径作为参数。请记住,只支持第一个冷却壁-其他冷却壁将被跳过。
查看器。从XML文件加载("example.xml“);
上述代码的效果应如下所示:
要清理员工,请使用ClearMusicalIncipit()
方法:
查看器。ClearMusicalIncipit();
我们还可以通过编程添加音符和音乐符号。首先,我们将在第2行添加G谱号:
裂缝c=新的裂缝(裂缝类型.GClef,2);查看器。添加音乐符号(c);
然后我们将添加一个新的季度注释G:
注释n=新的注释("G“,0,4、MusicalSymbolDuration。季度,注释阀杆方向。Up,NotesTieType。无,新的列表<NoteBeamType>(){NoteBeamType。单个});查看器。添加音乐符号(n);
Note构造函数的第一个参数是一串
表示以下步骤的名称之一:A、B、C、D、E、F、G。第二个参数是锐角数(正数)或平角数(负数),其中0表示没有变化。第三个参数是八度音阶的数字。接下来的参数是:音符的持续时间、音杆方向和领带类型(注释类型。无
如果便条没有系好)。最后一个参数是梁列表。如果注释没有任何梁,则它必须仍然具有只有一个元素的列表NoteBeamType。单个
(即使音符的持续时间大于第八个音符)。为了弄清楚波束列表是如何工作的,让我们尝试添加一组由两个波束组成的第十六个波束和第八个波束:
注释s1=新的注释("A“,0,4、MusicalSymbolDuration。第十六,注释阀杆方向。向下,NotesTieType。无,新的列表<NoteBeamType>(){NotesBeamType.Start,NotesBeamType.Start});注释s2=新的注释("C“,1,5、MusicalSymbolDuration。第十六,注释阀杆方向。向下,NotesTieType。无,新的列表<NoteBeamType>(){NotesBeamType.Continue,NotesBeamType.End});注释e=新的注意("D“,0,5、MusicalSymbolDuration。第八,注释阀杆方向。向下,NotesTieType。无,新的列表<NoteBeamType>(){NotesBeamType.End});查看器。添加音乐符号(s1);查看器。添加音乐符号(s2);查看器。添加音乐符号(e);
结果应该是这样的:
当所有梁都设置为NoteBeamType。单个
:
您可以通过更改彩色音符和音乐符号音乐角色颜色
属性:
尽管IncipitViewer(初始查看器)
它支持和弦,因为和弦是许多单声道乐器习惯用法的一部分。如果IsChord元素
注释的属性设置为真实的
,音符被视为前一音符的和弦元素:
注释n1=新的注释("C“,0,4、MusicalSymbolDuration。一半,注释阀杆方向。Up,NotesTieType。无,新的列表<NoteBeamType>(){NoteBeamType。单个});注释n2=新的注释("E“,0,4、MusicalSymbolDuration。一半,注释阀杆方向。Up,NotesTieType。无,新的列出<NoteBeanType>(){NoteBeanType。单个});注释n3=新的注释("G“,0,4、MusicalSymbolDuration。一半,注释阀杆方向。Up,NotesTieType。无,新的列表<NoteBeamType>(){NoteBeamType。单个});n2.IsChord元素=真实的;n3.IsChord元素=真实的;查看器。添加音乐符号(n1);查看器。添加音乐符号(n2);查看器。添加音乐符号(n3);
结果:
以下示例显示了如何插入点、休止符和横线:
注释n4=新的注释("A“,0,4、MusicalSymbolDuration。一半,注释阀杆方向。Up,NotesTieType。无,新的列表<NoteBeamType>(){NoteBeamType。单个});n4.点数=1;休息时间r=新的休息(MusicalSymbolDuration.Quarter);Barline b公司=新的Barline();查看器。添加音乐符号(n4);查看器。添加音乐符号(r);查看器。添加音乐符号(b);
结果:
当鼠标悬停在控件上时,右上角会出现两个按钮:第一个按钮用于保存音乐XML与控件关联的文件和第二次调用OnPlayExternalMidiPalayer
事件处理程序。您可以订阅播放ExternalMidiPalayer
事件:
查看器。播放ExternalMidiPalayer+=新的IncipitViewer。PlayExternalMidiPlayerDelegate(viewer_PlayExternalMidiPlay);
创建以下用于处理事件的函数:
空隙viewer_PlayExternalMidiPalayer(IncipitViewer发送方){}
在上述函数中,您可以放置一个代码来读取控件中的注释,并使用自己的函数或其他库来播放它们。要从控件访问所需的音乐符号,请使用IncipitViewer。初始元素(int i)
方法,其中我
是元素的索引。要将音符转换为midi音高,您可以使用音乐符号。ToMidiPitch(字符串步长,int alter,int倍频程)
方法。
打印的内容IncipitViewer(初始查看器)
控件,创建打印文档
对象并订阅其打印页面
事件:
私有的 空隙打印文档1_打印页面(对象发件人,系统。图纸。印刷。打印页面事件参数e){Graphics g=e.图形;查看器。DrawViewer(g,真实的);}
然后使用打印()
方法:
打印对话框dlg=新的PrintDialog();图纸。文档=printDocument1;如果(dlg.ShowDialog()==对话框结果。确定){printDocument1.Print();}
打印输出示例:
兴趣点
与分数的图形布局有关的一个奇怪的问题是确定梁下杆的适当长度。17年第个和18第个世纪印刷的等长音乐杆经常被使用,其结果是横梁“断裂”。分数看起来像这样:
然而,在当代音乐雕刻中,横梁必须是直的。不幸的是,直梁导致杆的长度可变,必须通过编程确定杆的适当长度。下图展示了实现这一目标所需的所有价值观:
为了确定茎末端的位置,我们必须找出y段的长度1,是组中最后一个音符的词干结尾和我们感兴趣的音符的词干结尾之间的垂直距离。因为:
tgα=y<sub>1
那么:
y<sub>1</sub>=x<sub>1
tg alpha值是组中第一个和最后一个音符的音干端点之间的垂直距离与组中第一和最后一条音符音干端点间的水平距离之比(我们假设我们知道这两个值):
tgα=y/x
因此:
y<sub>1(y/x)
年1是我们感兴趣的音符的茎端点的垂直坐标。
历史
在版本2.1.0.2中,我添加了彩色注释,并对IncipitViewer(初始查看器)
类以允许将此库移植到WPF。此库的WPF版本可用酒店雇员和饭馆雇员.