2010-10-29 13 views
23

Szukam narysować personel muzyczny na formularzu .NET (C#). Korzystam z Microsoft Visual C# 2010 Express. Zastanawiam się, czy ktoś wie o istniejącym kodzie lub istniejących darmowych bibliotekach .NET, które mogą pomóc w tym. Patrzę na rysunek zarówno zespołu wysokich tonów, jak i basu, i dodając jedną czwartą nutę do niektórych w miejscu pracy. Przygotowuję aplikację Piano Tester używającą C# dla mojego syna. Jeśli sami go zakodowuję, prawdopodobnie zastąpię metodę onPaint. Ale pomyślałem, że zobaczę, czy ktoś widział jakiś darmowy kod lub bibliotekę, żeby zacząć.Narysuj zespół muzyczny w C#

Dzięki.

+0

Wow dobry projekt. To brzmi interesująco! –

+1

+1 dla syna :-) – chiccodoro

+0

Zaakceptowałem odpowiedź na Unicode. Jedyne, co wciąż próbuję uzyskać, to jak odwrócić ćwierćnuta do góry nogami. – JeffJak

Odpowiedz

13

Nie są wymagane prymitywy do generowania muzycznych wyników w zestawie kodów Unicode (począwszy od U + 1D100). Na przykład U + 1D11A to 5-liniowy zespół, U + 1D158 to zamknięty nagłówek.

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

..then sprawa staje się upewniając się, że masz krój z odpowiednimi glifów w zestawie (i radzenia sobie z problemami rzeczy dystansowych poprawnie, itp)

jeśli jesteś chcąc wygenerować wydruki, powinieneś spojrzeć na Lilypond, który jest pakietem notacji muzycznej OSS, który wykorzystuje format pliku tekstowego do zdefiniowania zawartości muzycznej, a następnie generuje wspaniały wynik.

+1

+1 Miłe znalezisko na symbolach –

+0

Podoba mi się to rozwiązanie. Zainstalowałem czcionkę Symbola z tej strony.http: //www.fileformat.info/info/unicode/char/1d11e/fontsupport.htm. Ale nie wiem, jak narysować symbol. Próbowałem: Font f = new Font ("Symbola", 72); g.DrawString ("U + 1D11A", f, _noteBrush, 50, 4); Próbowałem również "\ u1D11A". Jakieś pomysły na temat wyglądu kodu? – JeffJak

+2

Nieważne ... Po prostu to wymyśliłem. Ostatecznie. Powyższa strona zawierała link do tego http://www.fileformat.info/info/unicode/char/1d11a/index.htm, który pokazał, że jest to kod: g.DrawString ("\ uD834 \ uDD1A", f , _noteBrush, 50, 4); – JeffJak

3

To będzie trudny projekt. Finale używa niestandardowej czcionki do notatek i innych symboli. To może być skuteczny sposób na rozpoczęcie pracy.

Możesz również sprawdzić Niffty. Jest to open source i napisane w Javie. Prawdopodobnie możesz przetłumaczyć ważne części lub pożyczyć pomysły.

Edit: ten może być również użyteczne: http://www.c-sharpcorner.com/UploadFile/mgold/musicmaker09242005015433AM/musicmaker.aspx

+0

Możesz zauważyć, że Niffty jest objęty licencją GPL. Więc nie jestem pewien co do części "przetłumacz z ważnych części", jeśli ma f.e. aplikacja o zamkniętym źródle. – Bobby

+0

Jeśli robi to oprogramowanie dla swojego syna, prawdopodobnie nie rozpowszechnia pliku wykonywalnego. W takim przypadku nie musi też publikować kodu. – Eyal

3

Jeśli myślisz o tym, liczba prymitywów potrzebnych do narysowania notacji muzycznej jest dość mała, szczególnie jeśli nie masz ochoty. Wszystko, co w zasadzie potrzebne jest:

  • linie pionowe (uwaga łodygi)
  • poziome linie (linie personelu)
  • Owale pełne i nakreślone (reprezentujące notatki)
  • Sharp i Mieszkania są już dostępne dla Ciebie z # i b

Istnieje kilka bardziej wyszukanych symboli, które pominąłem, takie jak wysokie tony, znaczniki basowe, ale te, które można sera z T i B lub znaleźć bardziej wyszukaną czcionkę, która może działać.

Bardzo prosty, przykładowy kod, aby dostać się zaczęło:

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

Funkcja ta farba będzie oczywiście musiał być o wiele bardziej dynamiczna: pełne pętle na swoich zbiorów prymitywów ...

+1

# i b w rzeczywistości nie są ostrymi i płaskimi symbolami. Ale są one dostępne w czcionkach Unicode. Nawet Tahoma je ma (ostre to U + 266F, a płaskie to U + 266D). – siride

+0

Myślę, że masz sposób na zbyt uproszczone, co jest potrzebne. Nawet na poziomie podstawowym potrzebujemy dynamiki, łuków itp. – Brad

+0

@Brad: Z pewnością upraszczam. Przykładowy kod ma tylko sześć lub siedem linii, które cokolwiek robią. A dynamika i łuk, jeśli rzeczywiście potrzebne, byłyby po prostu jeszcze dwoma prymitywami, które trzeba dodać do miksu. Moje notatki i przykład kodu są dosłownie punktem wyjścia dla programisty, który zaczyna myśleć o tym, jak taka aplikacja może się połączyć. –