2010-10-29 13 views
23

Sto cercando di disegnare uno staff musicale su una forma .NET (C#). Sto usando Microsoft Visual C# 2010 Express. Mi stavo chiedendo se qualcuno fosse a conoscenza del codice esistente o delle librerie .NET libere esistenti che possono essere d'aiuto. Sto cercando di disegnare sia lo spigolo che il basso e aggiungo una nota da un quarto ad alcuni dei membri dello staff. Sto facendo un'app Piano Tester usando C# per mio figlio. Se lo codifico personalmente, sostituirò proattivamente il metodo onPaint. Ma ho pensato di vedere se qualcuno ha visto qualche codice gratuito o libreria disponibile per farmi iniziare.Disegna uno staff musicale in C#

Grazie.

+0

Wow buon progetto. Sembra interessante! –

+1

+1 per il figlio :-) – chiccodoro

+0

Ho accettato la risposta Unicode, l'unica cosa che sto ancora cercando di lavorare è come capovolgere la nota del quarto. – JeffJak

risposta

13

Ci sono le primitive richieste per generare l'output musicale nel set di codici Unicode (a partire da U + 1D100). Ad esempio, U + 1D11A è uno staff a 5 righe, U + 1D158 è una testa nota chiusa.

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

..quindi la questione diventa facendo in modo di avere un carattere tipografico con i glifi appropriati incluso (e di affrontare i problemi di spaziatura cose correttamente, ecc)

se siete cercando di generare un output stampato, si dovrebbe guardare Lilypond, che è un pacchetto di notazione musicale OSS che utilizza un formato di file di testo per definire il contenuto musicale e quindi genera un output stupendo.

+1

+1 Bella trovata sui simboli –

+0

Mi piace questa soluzione. Ho installato il font Symbola da questo sito.http: //www.fileformat.info/info/unicode/char/1d11e/fontsupport.htm. Ma non so come disegnare il simbolo. Ho provato: Font f = new Font ("Symbola", 72); g.DrawString ("U + 1D11A", f, _noteBrush, 50, 4); Ho anche provato "\ u1D11A". Qualche idea su come dovrebbe apparire il codice? – JeffJak

+2

Non importa ... l'ho solo capito ... alla fine. Il sito sopra aveva un link a questo http://www.fileformat.info/info/unicode/char/1d11a/index.htm che mostrava che questo sarebbe il codice: g.DrawString ("\ uD834 \ uDD1A", f , _noteBrush, 50, 4); – JeffJak

3

Questo sarà un progetto difficile. Finale utilizza un carattere personalizzato per le note e altri simboli. Potrebbe essere un modo efficace per iniziare.

Si potrebbe anche verificare Niffty. È open source e scritto in Java. Probabilmente potresti tradurre le parti importanti o prendere in prestito concetti.

Edit: Questo può anche essere utile: http://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx

+0

Si potrebbe voler notare che Niffty è concesso in licenza sotto licenza GPL. Quindi non sono sicuro della parte 'translate the important parts over' se ha f.e. un'applicazione closed-source. – Bobby

+0

Se sta facendo questo software per suo figlio, probabilmente non sta distribuendo l'eseguibile. In tal caso, non ha nemmeno bisogno di pubblicare il codice. – Eyal

3

Se ci pensate, il numero di primitive necessarie per disegnare la notazione musicale è abbastanza piccolo, specialmente se non siete troppo fantasiosi. Tutto ciò che fondamentalmente serve è:

  • linee verticali (nota deriva)
  • linee orizzontali (linee personale)
  • ovali pieni e delineati (note che rappresentano)
  • Sharp e appartamenti sono già forniti per voi con # e b

ci sono alcuni simboli fantasiosi che ho omesso, come alti, marchi chiave di basso, ma quelli si potrebbe formaggio con T e B o trovare un font più elaborato che potrebbe funzionare.

Molto semplice, il codice di esempio per iniziare:

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

Questa funzione vernice sarebbe ovviamente dovuto essere molto più dinamici: pieno di loop sulle vostre collezioni di primitive ...

+1

# e b non sono in realtà i simboli taglienti e piatti. Ma sono disponibili nei caratteri Unicode. Anche Tahoma li ha (forte è U + 266F e piatto è U + 266D). – siride

+0

Penso che tu abbia semplificato in modo eccessivo ciò che è necessario. Anche a livello base, abbiamo bisogno di dinamiche, legature, ecc. – Brad

+0

@Brad: ho decisamente semplificato eccessivamente. Il codice di esempio ha solo sei o sette linee che fanno qualsiasi cosa. E le dinamiche e le legature, se effettivamente necessarie, sarebbero semplicemente altre due primitive che devono essere aggiunte al mix. Le mie note e il codice di esempio sono letteralmente il punto di partenza per un programmatore per iniziare a pensare a come un'applicazione simile potrebbe venire insieme. –