23

我希望在 .NET (C#) 表单上绘制音乐人员。我正在使用 Microsoft Visual C# 2010 Express。我想知道是否有人知道可以提供帮助的现有代码或现有的免费 .NET 库。我正在考虑绘制高音谱号和低音谱号谱表,并在谱表中的某些位置添加一个四分音符。我正在为我的儿子使用 C# 制作一个 Piano Tester 应用程序。如果我自己编写代码,我可能会重写 onPaint 方法。但我想我会看看是否有人看过一些免费的代码或库来帮助我入门。

4

6 回答 6

14

在 Unicode 代码集中(从 U+1D100 开始)有生成音乐输出所需的原语。例如,U+1D11A 是 5 行五线谱,U+1D158 是封闭符头。

http://www.unicode.org/charts/PDF/U1D100.pdf

..那么问题就变成了确保你有一个包含适当字形的字体(并处理正确间隔的问题等)

如果您希望生成打印输出,您应该查看Lilypond,它是一个 OSS 音乐符号包,它使用文本文件格式来定义音乐内容,然后生成华丽的输出。

于 2010-10-29T14:21:52.387 回答
5

您可能会看到几年前用 C# 编写的音乐编辑程序。我看起来有点前途: 音乐编辑程序

于 2010-10-29T14:17:56.777 回答
3

这将是一个困难的项目。Finale 为注释和其他符号使用自定义字体。这可能是让您入门的有效方法。

您还可以查看Niffty。它是开源的,用 Java 编写。您可能可以将重要部分翻译过来,或借用概念。

编辑:这也可能有用: http ://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx

于 2010-10-29T14:12:59.580 回答
3

如果您考虑一下,绘制乐谱所需的基元数量相当少,尤其是如果您不太花哨的话。您基本上需要的是:

  • 垂直线(注意词干)
  • 水平线(员工线)
  • 椭圆形完整和轮廓(代表注释)
  • 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);
    }
}

这个绘制函数当然必须更加动态:在你的原语集合上充满循环......

于 2010-10-29T14:18:57.657 回答
0

如果您喜欢在自定义 C# 应用程序中使用 1D100.pdf 中描述的 Unicode 音乐符号。以下内容将帮助您入门:

于 2011-08-22T17:18:16.827 回答
0

之前的评论员提到为此目的将 java 的 Niffty 工具移植到 c#。

原来它已经完成了,效果很好。

于 2017-05-31T04:57:06.507 回答