用C#画一个音乐人员

时间:2010-10-29 14:06:43

标签: c# .net draw libraries music-notation

我希望在.NET(C#)表单上绘制音乐人员。我使用的是Microsoft Visual C#2010 Express。我想知道是否有人知道现有代码或现有的免费.NET库可以帮助解决这个问题。我正在考虑绘制高音和低音谱号的工作人员,并在工作人员的某些地方添加四分音符。我正在为我的儿子使用C#制作钢琴测试器应用程序。如果我自己编写代码,我可以直接覆盖onPaint方法。但我想我会看到是否有人看到过一些免费的代码或库可以让我开始。

6 个答案:

答案 0 :(得分:13)

在Unicode代码集中生成音乐输出所需的基元(从U + 1D100开始)。例如,U + 1D11A是一个5行的工作人员,U + 1D158是一个封闭的符头。

请参阅http://www.unicode.org/charts/PDF/U1D100.pdf

..然后问题变得确保你有一个包含适当字形的字体(并处理正确间隔的问题等)。

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

答案 1 :(得分:5)

几年前你可能会看一下用C#编写的音乐编辑程序。我看起来很有希望: Music Editing Program

答案 2 :(得分:3)

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

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

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

答案 3 :(得分: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);
    }
}

这个绘画功能当然必须更加动态:在你的原语集合中充满了循环......

答案 4 :(得分:0)

如果您想在自定义C#应用程序中使用1D100.pdf中描述的unicode Musical Symbols。以下内容将帮助您入门:

答案 5 :(得分:0)

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

Turns out it's already been done,效果很好。