Dessinez une portée musicale en C#
je cherche à dessiner une portée musicale sur un formulaire .NET (C#). Je suis l'aide de Microsoft Visual C# 2010 Express. Je me demandais si quelqu'un connaissait le code existant ou les bibliothèques gratuites .NET qui peuvent aider avec ça. Je cherche à dessiner à la fois la portée de la clé tréble et de la clé basse et à ajouter un quart de note à certains endroits de la portée. Je fais une application de testeur de Piano en utilisant C# pour mon fils. Si je le code moi-même, je vais probablement juste annuler la méthode onPaint. Mais j'ai pensé que je verrais si quelqu'un j'ai vu du code gratuit ou une bibliothèque disponible pour me lancer.
Merci.
6 réponses
il y a les primitives nécessaires pour générer la sortie musicale dans le jeu de code Unicode (à partir de U+1D100). Par exemple, U+1D11A est une portée à 5 lignes, U+1d158 est un bloc-notes fermé.
voir http://www.unicode.org/charts/PDF/U1D100.pdf
..ensuite, la question devient de s'assurer que vous avez une police de caractères avec les glyphes appropriés inclus (et de traiter les questions d'espacement des choses correctement, etc.)
si vous cherchez à générer la sortie imprimée, vous devriez regarder les Lilypond, qui est un paquet de notation de musique OSS qui utilise un format de fichier texte pour définir le contenu musical puis génère une sortie magnifique.
vous pourriez regarder un programme de montage de musique écrit en C# il y a quelques années. Je regarde un peu prometteuse: Programme De Montage De Musique
Ce sera un projet difficile. Finale utilise une police personnalisée pour les notes et autres symboles. Que pourrait être un moyen efficace pour obtenir vous avez commencé.
Vous pouvez également consulter Niffty. C'est open source et écrit en Java. Vous pouvez probablement traduire les parties importantes ou emprunter des concepts.
Edit: Cela peut aussi être utile: http://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx
si vous y pensez, le nombre de primitives nécessaires pour dessiner la notation musicale est assez petit, surtout si vous n'êtes pas trop fantaisiste. Tous vous avez besoin est:
- lignes verticales (tiges de note)
- lignes Horizontales (lignes)
- Ovales complet et décrites (représentant les notes)
- Sharp et les Appartements sont déjà fournis pour vous avec # et b
Il y a des symboles Plus fantaisistes que j'ai omis tels que treble, bass des marques de fente, mais celles que vous pourriez fromage avec T et B ou trouver une police plus fantaisiste qui pourrait fonctionner.
Très simple, des exemples de code pour vous aider à démarrer:
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);
}
}
cette fonction de peinture devrait bien sûr être beaucoup plus dynamique: pleine de boucles sur vos collections de primitives...
si vous aimez utiliser les Symboles musicaux unicode tels que décrits dans le 1D100.pdf dans une application custom c#. La suivante vous permettra de commencer:
- télécharger la police Symbola de http://users.teilar.gr / ~g1951d/
- http://hongouru.blogspot.com/2010/10/c-how-to-add-fonts-ttf-true-type-fonts.html
- http://www.bobpowell.net/embedfonts.htm
- utilisation de caractères unicode 32 bits dans les chaînes
\U0001D100
-\U00001D1FF
un commentateur précédent a mentionné le portage de l'outil Niffty de java vers c# à cette fin.
s'avère que c'est déjà fait, fonctionne très bien.