Gritarren Scale Tool

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Antworten
Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Gritarren Scale Tool

Beitrag von Varus »

Hallo zusammen,
ich muss für die FH ein kleines Delphi/Lazarus Programm schreiben und habe mich nun dafür entschieden ein Gitarrentool zu schreiben. Ich selber spiele Gitarre und möchte manchmal gerne Irgendwo nachschlagen wie ich oder wo ich den Akkord noch greifen kann, bzw. welche Töne noch zu der Skale passen und dann natürlich wo sie auf dem Griffbrett zu finden sind. Ich erfinde das Rad nicht neu http://www.bing.com/images/search?q=guitar+scale+programme+&FORM=AWIR#view=detail&id=2EF700CDE4A2933FC8689A4E6CD69D895D4BC742&selectedIndex=20 aber denke das es vom umfang her gut passt. Da ich blutiger Anfänger bin ist das auch für weitere Projekte sicher eine gute Übung. Das Programmieren macht echt spaß und es ist toll so schnell erfolge zu sehen. Ich habe mir gedacht dass ich hier meine Arbeitsfortschritte dokumentiere und bei Hilfe in diesem Thread drüber diskutieren kann. Falls das hier nicht gewünscht ist bitte ich drum den Thread zu verschieben!

Nun zum Projekt:

Für alle Nichtmusiker ist es vllt schwer zu erklären. Die Idee ist es, dass ich mir das Griffbrett einer Gitarre im unteren Bereich anzeigen lassen kann und je nachdem welche Akkorde oder Skale ich ausgewählt habe die entsprechenden Noten auf dem Griffbrett eingeblendet bekomme. Das heißt ich werde ein Image einfügen das mir immer ein Griffbrett anzeigt und dann über eine Listbox die Parameter einstellen kann, und dann die Punkte wo man zu greifen hat (also die Noten) mit beschriftung auf dem Image angezeigt bekomme. Natürlich sollte sich auch das Image automatisch auf die Größe des Fensters einstellen und ständig "aktuallisieren". Das ganze habe ich versucht mit einem Timer zu realisieren der ständig die Größe überprüft und neu ausgibt. Das Klappt genau 1 Periode, danach ist das Image einfach schwarz. Er zeichnet zunächst das Griffbrett und dann beim nächsten Timerereignis wirds schwarz. Ich weiß nicht genau woran es liegt, vllt habt ihr eine Idee oder auch eine Lösung. Das Panel ist lediglich dazu da um die Aktuelle Uhrzeit anzuzeigen, wie gesagt es ist ein Uni Projekt und wird nach Aufwand und Funktion bewertet, daher wird das ein oder andere Tool (wie Uhrzeit) eingebaut sein um ein paar plus Punkte zu sammeln.

Hier mal der Quelltext:

Code: Alles auswählen

 
procedure TForm1.FrmtmrTimer(Sender: TObject);
  var
  Frm1w,Frm1h                         :Integer;           //Form1
  x1,x2,y1,y2                         :Integer;           //Rectangel
  xs1,xs2,yb1,yb2                     :Integer;           //Anfang-Ende Saiten
  anzSait, AbstdS, AnzB,AbstdB,i,j    :Integer;           //Helfer
 
begin
 
       Frm1w:=Form1.Width;
       Frm1h:=Form1.Height;
 
       image1.Top:=frm1h-StatusBar1.Height-image1.Height;               //Image1 Format
       image1.left:=0;
       image1.width:=Frm1w;                           //Image1 Format
 
       panel1.Top:=0;                                 //Uhrausrichtung
       panel1.Left:=Frm1w-Panel1.Width;
 
 
 
     x1:=0;                                               //Image1 Rectangle
     y1:=0;
     x2:=image1.Width;
     y2:=image1.Height;
 
     image1.Canvas.Rectangle(x1,y1,x2,y2);            //Image1 Rectangle
     image1.Canvas.Brush.Color:=Clwhite;
     image1.Canvas.Pen.Color:=Clwhite;
 
 
     //Saiten Zeichnen
     xs1:=50;                                            //Anfang Saiten
     xs2:=image1.Width-10;                               //Ende Saiten
     anzSait:=6;
     AbstdS:=(image1.height)div(anzSait+2);          //Saiten Abstand berechnen
     Image1.Canvas.Pen.Width:=3;                         //Saiten Zeichnen
     Image1.Canvas.Pen.Color:=ClBlack;
     Image1.Canvas.Brush.Color:=ClBlack;
 
 
 
      for j:=1 to AnzSait do
         begin
              Image1.Canvas.Line(xs1,j+AbstdS*j,xs2,j+AbstdS*j);
         end;
 
 
           //Bünde zeichnen
     AnzB:=24;                                            //Bundabstände berechnen
     AbstdB:=(image1.Width)div(anzB+2);
     yb1:=0;
     yb2:=image1.Height;
 
     Image1.Canvas.Pen.Width:=3;                          //Bünde Zeichnen
     Image1.Canvas.Pen.Color:=RGBtoColor(0,0,0);
     image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
 
     for i:=1 to AnzB do
         begin
              Image1.Canvas.Line(i+AbstdB*i,yb1,i+AbstdB*i,yb2);
         end;
 
 
 
end;                                   
 
  


Danke Gruß Varus

Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Re: Gritarren Scale Tool

Beitrag von Varus »

Okay hab´s eben selst rausgefunden. Das Zeichnen muss natürlich ans Ende der "Formateinstellungen".

Also anstatt:

Code: Alles auswählen

 
     image1.Canvas.Rectangle(x1,y1,x2,y2);            //Image1 Rectangle     
     image1.Canvas.Brush.Color:=Clwhite;
     image1.Canvas.Pen.Color:=Clwhite;
 


Muss es so aussehen,

Code: Alles auswählen

 
     image1.Canvas.Brush.Color:=Clwhite;
     image1.Canvas.Pen.Color:=Clwhite;
     image1.Canvas.Rectangle(x1,y1,x2,y2);            //Image1 Rectangle     
 


Wenn euch weitere Sachen auffallen oder verbesserungsfähig sind bin ich für Ratschläge gerne offen :)
Gruß

Andersan
Beiträge: 1
Registriert: Mi 29. Okt 2014, 09:13

Re: Gritarren Scale Tool

Beitrag von Andersan »

Das Klappt genau 1 Periode, danach ist das Image einfach schwarz. Er zeichnet zunächst das Griffbrett und dann beim nächsten Timerereignis wirds schwarz. Ich weiß nicht genau woran es liegt, vllt habt ihr eine Idee oder auch eine Lösung. Das Panel ist lediglich dazu da um die Aktuelle Uhrzeit anzuzeigen, wie gesagt es ist ein Uni Projekt und wird nach Aufwand und Funktion bewertet, daher wird das ein oder andere Tool (wie Uhrzeit) eingebaut sein um ein paar plus Punkte zu sammeln.




_____________________
Download high quality 642-874 free exam questions - braindumps.com dumps to prepare and pass IBM with oracle certification dumps certification. Also get free demos of wiki pedia for review of jncia training.
Zuletzt geändert von Andersan am Mi 19. Nov 2014, 06:47, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Gritarren Scale Tool

Beitrag von wp_xyz »

Möglich, dass du das irgendwie hinkriegst, aber du wirst mit so einer Lösung nicht lange glücklich sein. Das Zeichnen hat in dem OnTimer-Event überhaupt nichts verloren - wenn du zwischen den Timern z.B. ein anderes Fenster drüberschiebst, ist alles weg. DIe Ausgabe darf nur im Zusammenhang einer durch Windows initiierten Paint-Routine erfolgen.

Die sauberste Lösung ist, eine Komponente TGitarre zu schreiben, in dessen Paint-Routine du das Griffbrett zeichnest, und die zu mit der Eigenschaft "Noten" ausstattest, die dann bewirkt, dass die gedrückten Saiten entsprechend markiert werden. Der Timer bewirkt lediglich das Neuzeichnen der TGitarre.

Falls du dich an eine eigene Komponente nicht heranwagst, nimm eine TPaintBox, in der das Ereignis OnPaint für die Ausgabe zuständig ist. Auf diese Weise wird wieder die Ausgabe von der restlichen Programmlogik getrennt.

Wie das Endergebnis der Ausgabe aussehen soll, habe ich noch nicht verstanden: Soll ein ganzes Lied als Tabulatur aufgezeichnet werden, so wie es in einigen der von dir verlinkten Bildern zu sehen ist, oder soll lediglich 1 Griff dargestellt werden? Im ersteren Fall muss die TGitarre alle anzuzeigenden Noten als Funktion der Zeit kennen, im letzten Fall ist nur 1 Satz Noten erforderlich.

[EDIT] Oh - hab gerade gesehen, der Original-Thread ist ja aus 2013...

Antworten