我希望在 .NET (C#) 表单上绘制音乐人员。我正在使用 Microsoft Visual C# 2010 Express。我想知道是否有人知道可以提供帮助的现有代码或现有的免费 .NET 库。我正在考虑绘制高音谱号和低音谱号谱表,并在谱表中的某些位置添加一个四分音符。我正在为我的儿子使用 C# 制作一个 Piano Tester 应用程序。如果我自己编写代码,我可能会重写 onPaint 方法。但我想我会看看是否有人看过一些免费的代码或库来帮助我入门。
6 回答
在 Unicode 代码集中(从 U+1D100 开始)有生成音乐输出所需的原语。例如,U+1D11A 是 5 行五线谱,U+1D158 是封闭符头。
见http://www.unicode.org/charts/PDF/U1D100.pdf
..那么问题就变成了确保你有一个包含适当字形的字体(并处理正确间隔的问题等)
如果您希望生成打印输出,您应该查看Lilypond,它是一个 OSS 音乐符号包,它使用文本文件格式来定义音乐内容,然后生成华丽的输出。
您可能会看到几年前用 C# 编写的音乐编辑程序。我看起来有点前途: 音乐编辑程序
这将是一个困难的项目。Finale 为注释和其他符号使用自定义字体。这可能是让您入门的有效方法。
您还可以查看Niffty。它是开源的,用 Java 编写。您可能可以将重要部分翻译过来,或借用概念。
编辑:这也可能有用: http ://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx
如果您考虑一下,绘制乐谱所需的基元数量相当少,尤其是如果您不太花哨的话。您基本上需要的是:
- 垂直线(注意词干)
- 水平线(员工线)
- 椭圆形完整和轮廓(代表注释)
- Sharp 和 Flats 已经为您提供了 # 和 b
我省略了一些更高级的符号,例如高音、低音谱号,但那些你可以用 T 和 B 奶酪或找到可能工作的更高级的字体。
非常简单的示例代码可以帮助您入门:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
public partial class MusicForm : Form
{
public MusicForm()
{
InitializeComponent();
}
private int _staffHght = 15;
private int _noteHght = 12;
private int _noteWdth = 20;
private Pen _notePen = new Pen(Color.Black, 2);
private Brush _noteBrush = Brushes.Black;
private void musicPanel_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
// draw some staff lines
for (int i = 1; i < 6; i++)
g.DrawLine(Pens.Black, 0, i * _staffHght, musicPanel.Width, i * _staffHght);
// draw four semi-random full and quarter notes
g.DrawEllipse(_notePen, 10, 2 * _staffHght, _noteWdth, _noteHght);
g.DrawEllipse(_notePen, 50, 4 * _staffHght, _noteWdth, _noteHght);
g.FillEllipse(_noteBrush, 100, 2 * _staffHght, _noteWdth, _noteHght);
g.FillEllipse(_noteBrush, 150, 4 * _staffHght, _noteWdth, _noteHght);
}
}
这个绘制函数当然必须更加动态:在你的原语集合上充满循环......
如果您喜欢在自定义 C# 应用程序中使用 1D100.pdf 中描述的 Unicode 音乐符号。以下内容将帮助您入门:
- 从http://users.teilar.gr/~g1951d/下载 Symbola 字体
- http://hongouru.blogspot.com/2010/10/c-how-to-add-fonts-ttf-true-type-fonts.html
- 如何嵌入 True Type 字体
- 在字符串中使用 32 位 unicode 字符
\U0001D100
-\U00001D1FF
之前的评论员提到为此目的将 java 的 Niffty 工具移植到 c#。
原来它已经完成了,效果很好。