2010-10-29 18 views
23

Estoy buscando dibujar un equipo de música en un formulario .NET (C#). Estoy usando Microsoft Visual C# 2010 Express. Me preguntaba si alguien conocía el código existente o las librerías .NET existentes que pueden ayudar con eso. Estoy buscando dibujar tanto el personal de agudos como de clave de graves y agregar una nota de un cuarto a algunos en el personal. Estoy haciendo una aplicación Piano Tester usando C# para mi hijo. Si lo codifico yo mismo, reemplazaré el método onPaint. Pero pensé que vería si alguien ha visto algún código o biblioteca gratuita disponible para ayudarme a comenzar.Dibujar un equipo de música en C#

Gracias.

+0

Wow buen proyecto. ¡Suena interesante! –

+1

+1 para el hijo :-) – chiccodoro

+0

He aceptado la respuesta Unicode, solo hay algo que todavía estoy tratando de poner en práctica es cómo voltear la negra al revés. – JeffJak

Respuesta

13

Hay son las primitivas requeridas para generar salida musical en el conjunto de códigos Unicode (comenzando en U + 1D100). Por ejemplo, U + 1D11A es un equipo de 5 líneas, U + 1D158 es un titular de nota cerrado.

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

..then la cuestión se convierte asegurándose de que usted tiene un tipo de letra con los glifos apropiados incluyen (y hacer frente a los problemas de espaciado cosas correctamente, etc.)

SI eres buscando generar resultados impresos, debe mirar Lilypond, que es un paquete de notación musical OSS que usa un formato de archivo de texto para definir el contenido musical y luego genera un magnífico resultado.

+1

+1 Buen hallazgo en los símbolos –

+0

Me gusta esta solución. Instalé la fuente de Symbola desde este sitio.http: //www.fileformat.info/info/unicode/char/1d11e/fontsupport.htm. Pero no sé cómo dibujar el símbolo. Lo he intentado: Font f = new Font ("Symbola", 72); g.DrawString ("U + 1D11A", f, _noteBrush, 50, 4); También probé "\ u1D11A". ¿Alguna idea sobre cómo se vería el código? – JeffJak

+2

No importa ... Lo descubrí ... por fin. El sitio anterior tenía un enlace a este http://www.fileformat.info/info/unicode/char/1d11a/index.htm que mostraba que este sería el código: g.DrawString ("\ uD834 \ uDD1A", f , _noteBrush, 50, 4); – JeffJak

3

Este será un proyecto difícil. Finale usa una fuente personalizada para notas y otros símbolos. Esa podría ser una forma eficiente de comenzar.

También puede visitar Niffty. Es de código abierto y está escrito en Java. Probablemente puedas traducir las partes importantes o tomar prestados los conceptos.

Editar: Esto también puede ser útil: http://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx

+0

Es posible que desee tener en cuenta que Niffty tiene licencia bajo la GPL. Por lo tanto, no estoy seguro acerca de la parte de "traducir las partes importantes" si tiene f.e. una aplicación de fuente cerrada. – Bobby

+0

Si está creando este software para su hijo, probablemente no esté distribuyendo el ejecutable. En ese caso, tampoco necesita publicar el código. – Eyal

3

Si lo piensas bien, el número de primitivas necesarias para dibujar la notación musical es bastante pequeño, especialmente si no te gusta demasiado. Todo lo que necesita básicamente es:

  • líneas verticales (nota tallos)
  • líneas horizontales (líneas de personal)
  • óvalos plenos y descritos (notas que representan)
  • Sharp y Pisos Ya se proporcionan para usted con # yb

Hay algunos símbolos más elegantes que omití, como los agudos, las marcas de las cuerdas de los graves, pero los que podría buscar con T y B o encontrar una fuente más elegante que pueda funcionar.

Muy simple, código de ejemplo para empezar:

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); 
    } 
} 

Esta función pintura sería, por supuesto, tiene que ser mucho más dinámica: lleno de bucles en sus colecciones de primitivas ...

+1

# yb no son realmente los símbolos agudos y planos. Pero están disponibles en fuentes Unicode. Incluso Tahoma los tiene (agudo es U + 266F y plano es U + 266D). – siride

+0

Creo que tienes demasiado simplificado lo que se necesita. Incluso en el nivel básico, necesitamos dinámicas, insultos, etc. – Brad

+0

@radio: Definitivamente me he simplificado demasiado. El código de muestra tiene solo seis o siete líneas que hacen cualquier cosa. Y las dinámicas y las difamaciones, si realmente se necesitan, serían simplemente dos primitivas más que deben agregarse a la mezcla. Mis notas y mi código de muestra son literalmente el punto de partida para que un programador comience a pensar cómo una aplicación como esta podría combinarse. –