Blame platform-demos/el/guitar-tuner.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="guide" style="task" id="guitar-tuner.js" xml:lang="el">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Συντονιστής κιθάρας (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="js#examples"/>
Packit 1470ea
    <revision version="0.1" date="2012-03-09" status="stub"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Susanna Huhtanen</name>
Packit 1470ea
      <email its:translate="no">ihmis.suski@gmail.com</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <desc>Χρησιμοποιήστε GTK+ και GStreamer για να κατασκευάσετε μια απλή εφαρμογή ρυθμιστή κιθάρας για το GNOME.</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
Packit 1470ea
      <mal:email>team@gnome.gr</mal:email>
Packit 1470ea
      <mal:years>2012-2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Δημήτρης Σπίγγος</mal:name>
Packit 1470ea
      <mal:email>dmtrs32@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012, 2013</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Μαρία Θουκιδίδου</mal:name>
Packit 1470ea
      <mal:email>marablack3@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Θάνος Τρυφωνίδης</mal:name>
Packit 1470ea
      <mal:email>tomtryf@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014, 2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>Συντονιστής κιθάρας</title>
Packit 1470ea
Packit 1470ea
    <synopsis>
Packit 1470ea
      

Σε αυτό το μάθημα θα κατασκευάσουμε μια μικρή εφαρμογή, Guitar Tuner, χρησιμοποιώντας JavaScript, GTK+ και GStreamer. Για να κάνετε και να τρέξετε όλα τα παραδείγματα κώδικα οι ίδιοι, χρειαζόσαστε έναν επεξεργαστή για το γράψιμο του κώδικα, τερματικό και GNOME 3 ή μεταγενέστερο εγκατεστημένο στον υπολογιστή σας.

Packit 1470ea
   <list>
Packit 1470ea
      <item>

<link xref="#gstreamer">Διοχετεύσεις GStreamer</link>

</item>
Packit 1470ea
      <item>

<link xref="#script">Σενάριο για εκτέλεση της εφαρμογής</link>

</item>
Packit 1470ea
      <item>

<link xref="#imports">Βιβλιοθήκες για εισαγωγή</link>

</item>
Packit 1470ea
      <item>

<link xref="#mainwindow">Δημιουργία του κύριου παραθύρου για την εφαρμογή</link>

</item>
Packit 1470ea
      <item>

<link xref="#buttons">Κουμπιά για τις μελωδίες</link>

</item>
Packit 1470ea
      <item>

<link xref="#playSound">Κάνοντας τους ήχους με GStreamer</link>

</item>
Packit 1470ea
      <item>

<link xref="#connecting">Συνδέοντας κουμπιά στο playSound</link>

</item>
Packit 1470ea
      <item>

<link xref="#guitarjs">Ολόκληρο το προόγραμμα</link>

</item>
Packit 1470ea
      <item>

<link xref="#terminal">Εκτέλεση της εφαρμογής από τερματικό</link>

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </synopsis>
Packit 1470ea
  

Μετά την ανάγνωση αυτού του μαθήματος, θα πρέπει να δείτε αυτό στην οθόνη σας:

Packit 1470ea
  <media type="image" mime="image/png" src="media/guitar-tuner.png"/>
Packit 1470ea
  <section id="gstreamer">
Packit 1470ea
    <title>Διοχετεύσεις GStreamer</title>
Packit 1470ea
    

Το Gtreamer είναι ο σκελετός πολυμέσων του GNOME — μπορείτε να το χρησιμοποιήσετε για να αναπαράγετε, ηχογραφήσετε, και να επεξεργαστείτε βίντεο, ήχο, ροές βίντεο και τα λοιπά. Εδώ, θα το χρησιμοποιήσουμε για να παράγουμε μονές-συχνότητες τόνων.

Packit 1470ea
    

Εννοιολογικά, το GStreamer λειτουργεί ως εξής: δημιουργείς μια διοχέτευση που περιέχει διάφορα επεξεργαζόμενα στοιχεία που πηγαίνουν από την πηγή στην έξοδο. Η πηγή μπορεί να είναι ένα αρχείο εικόνας, βίντεο, ή και μουσικής, για παράδειγμα, και η έξοδος μπορεί να είναι ένα γραφικό στοιχείο ή η κάρτα ήχου.

Packit 1470ea
    

Ανάμεσα στην πηγή και στην έξοδο, μπορείτε να εφαρμόσετε διάφορα φίλτρα και οι μετατροπείς να χειριστούν εφέ, μετατροπές μορφών και λοιπά. Κάθε στοιχείο της διοχέτευσης έχει ιδιότητες που μπορούν να χρησιμοποιηθούν για να αλλάξουν τη συμπεριφορά τους.

Packit 1470ea
    <media type="image" mime="image/png" src="media/guitar-tuner-pipeline.png">
Packit 1470ea
      

Ένα παράδειγμα διοχέτευσης GStreamer.

Packit 1470ea
    </media>
Packit 1470ea
  </section>
Packit 1470ea
  <section id="script">
Packit 1470ea
    <title>Σενάριο για εκτέλεση της εφαρμογής</title>
Packit 1470ea
    
Packit 1470ea
  #!/usr/bin/gjs
Packit 1470ea
    

Αυτή η γραμμή λέει πώς θα εκτελεστεί το σενάριο. Πρέπει να είναι η πρώτη γραμμή του κώδικα και να είναι εκτελέσιμη. Για λήψη των δικαιωμάτων εκτέλεσης πηγαίνετε στον τερματικό και εκτελέστε στον σωστό φάκελο: chmod +x όνομα σεναρίου. Ή μπορείτε να χρησιμοποιήσετε τον διαχειριστή αρχείου γραφικών. Απλά πηγαίνετε στον σωστό φάκελο όπου είναι ο κώδικας σας δεξί κλικ στο αρχείο του κώδικα σας, επιλέξτε ιδιότητες, κλικ στην καρτέλα δικαιωμάτων και σημειώστε το πλαίσιο για να επιτραπεί η εκτέλεση του αρχείου ως πρόγραμμα

Packit 1470ea
  </section>
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Βιβλιοθήκες για εισαγωγή</title>
Packit 1470ea
    
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
var Gst = imports.gi.Gst;
Packit 1470ea
Packit 1470ea
const Mainloop = imports.mainloop;
Packit 1470ea
    

Για να υπάρχει ένα λειτουργικό πρόγραμμα χρειάζεται να εισαχθούν λίγα GObject αυτοελέγχου - βιβλιοθήκες για τη χρήση μας. Για λειτουργικό UI, χρειάζεται Gtk και για Gstreamer χρειάζεται Gst. Αυτά εισάγονται στην αρχή για να τα έχουμε για χρήση παντού. Επίσης στην αρχή εισάγουμε έναν κύριο βρόχο κατασκευής για χειρισμό του χρόνου λήξης στη χρήση του με ήχους μελωδίας.

Packit 1470ea
    </section>
Packit 1470ea
  <section id="mainwindow">
Packit 1470ea
    <title>Δημιουργία του κύριου παραθύρου για την εφαρμογή</title>
Packit 1470ea
    
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
Gst.init(null, 0);
Packit 1470ea
Packit 1470ea
var guitarwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL, border_width: 100});
Packit 1470ea
guitarwindow.title = "Guitar Tuner";
Packit 1470ea
guitarwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
Packit 1470ea
guitarwindow.show();
Packit 1470ea
Gtk.main();
Packit 1470ea
    

Η εισαγωγή των Gtk και Gst δεν είναι αρκετή, χρειάζεται η αρχικοποίησή τους για να δουλέψουν. Όταν τα Gtk και Gst εκτελούνται χρειάζεται να δημιουργήσουμε το παράθυρο για την εφαρμογή. Αργότερα πρόκειται να βάλουμε όλα τα κουμπιά να παράγουν ήχους μέσα σε αυτό το παράθυρο. Για την εμφάνιση του παραθύρου, χρειαζόμαστε να του πούμε να εμφανιστεί και χρειαζόμαστε επίσης να τρέξει ο κώδικας με το Gtk.main()

Packit 1470ea
  </section>
Packit 1470ea
  <section id="buttons">
Packit 1470ea
   <title>Κουμπιά για τις μελωδίες</title>
Packit 1470ea
   
Packit 1470ea
var guitar_box = new Gtk.ButtonBox ({orientation: Gtk.Orientation.VERTICAL, spacing: 10});
Packit 1470ea
Packit 1470ea
var E = new Gtk.Button({label: "E"});
Packit 1470ea
var A = new Gtk.Button({label: "A"});
Packit 1470ea
var D = new Gtk.Button({label: "D"});
Packit 1470ea
var G = new Gtk.Button({label: "G"});
Packit 1470ea
var B = new Gtk.Button({label: "B"});
Packit 1470ea
var e = new Gtk.Button({label: "e"});
Packit 1470ea
Packit 1470ea
guitar_box.add(E);
Packit 1470ea
guitar_box.add(A);
Packit 1470ea
guitar_box.add(D);
Packit 1470ea
guitar_box.add(G);
Packit 1470ea
guitar_box.add(B);
Packit 1470ea
guitar_box.add(e);
Packit 1470ea
Packit 1470ea
guitarwindow.add(guitar_box);
Packit 1470ea
Packit 1470ea
guitar_box.show_all();
Packit 1470ea
   

Επειδή το Gtk.Window μπορεί να περιέχει μόνο ένα γραφικό στοιχείο, χρειάζεται να δημιουργηθεί κάτι από κάτω του για να μπορεί να προσθέσει όλα τα απαραίτητα κουμπιά μέσα του. Σε αυτό το παράδειγμα χρησιμοποιούμε πλαίσιο κουμπιού. Μετά τη δημιουργία του πλαισίου κουμπιού δημιουργούμε κουμπιά με αναγκαίες ετικέτες. Αφού έχουμε τα κουμπιά πρέπει να τα προσθέσουμε στο πλαίσιο κουμπιού και το πλαίσιο κουμπιού πρέπει να προστεθεί στο Gtk.Window και όλα στο πλαίσιο κουμπιού πρέπει να εμφανίζονται.

Packit 1470ea
   

Μετά από αυτό το στάδιο πρέπει να έχετε ένα εμφανιζόμενο παράθυρο στην οθόνη σας που να δείχνει 6 κουμπιά. Τώρα τα κουμπιά δεν κάνουν τίποτα και θα αντιμετωπίσουμε αυτό το θέμα αργότερα. Πριν να μπορέσουμε να συνδέσουμε τα σήματα του κουμπιού με κάτι χρειάζεται να κωδικοποιήσουμε αυτό το κάτι πρώτα.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="playSound">
Packit 1470ea
   <title>Κάνοντας τους ήχους με GStreamer</title>
Packit 1470ea
   
Packit 1470ea
var frequencies = {E: 329.63, A: 440,	D: 587.33,	G: 783.99,	B: 987.77,	e: 1318.5}
Packit 1470ea
Packit 1470ea
function playSound(frequency){
Packit 1470ea
  var pipeline = new Gst.Pipeline({name: "note"});
Packit 1470ea
  var source = Gst.ElementFactory.make("audiotestsrc","source");
Packit 1470ea
  var sink = Gst.ElementFactory.make("autoaudiosink","output");
Packit 1470ea
Packit 1470ea
  source.set_property('freq', frequency);
Packit 1470ea
  pipeline.add(source);
Packit 1470ea
  pipeline.add(sink);
Packit 1470ea
  source.link(sink);
Packit 1470ea
  pipeline.set_state(Gst.State.PLAYING);
Packit 1470ea
Packit 1470ea
  Mainloop.timeout_add(500, function () {
Packit 1470ea
    pipeline.set_state(Gst.State.NULL);
Packit 1470ea
	  return false;
Packit 1470ea
  });
Packit 1470ea
}
Packit 1470ea
   

Το πρώτο πράγμα που χρειαζόμαστε είναι να αποφασίσουμε τι μελωδίες θέλουμε να κάνουμε όταν πατάμε ένα κουμπί. Η λίστα συχνοτήτων το φροντίζει. Μετά από αυτό φροντίζουμε να κάνει στην πραγματικότητα τους ήχους με τη συνάρτηση playSound. Για τη συνάρτηση playSound δίνουμε ως είσοδο μια συχνότητα (που μόλις ορίσαμε στη μεταβλητή συχνοτήτων). Το πρώτο πράγμα που χρειαζόμαστε να κατασκευάσουμε είναι μια διοχέτευση, μια πηγή και μια έξοδο. Για την πηγή ορίζουμε τη συχνότητα. Στη διοχέτευση προσθέτουμε και την πηγή και την έξοδο και έπειτα της λέμε να συνεχίσει να παίζει. Ως τελευταίο πράγμα χρησιμοποιούμε τη σταθερά κύριου βρόχου για να κάνει τη διοχέτευση να σταματήσει μετά από 500ms.

Packit 1470ea
   

Τώρα έχουμε τη μέθοδο αναπαραγωγής μιας μελωδίας πατώντας ένα κουμπί. Μετά γίνονται οι συνδέσεις μεταξύ πατήματος ενός κουμπιού και αναπαραγωγής του σωστού ήχου από αυτό το κουμπί.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="connecting">
Packit 1470ea
   <title>Συνδέοντας κουμπιά στο playSound</title>
Packit 1470ea
   
Packit 1470ea
E.connect("clicked", function() {
Packit 1470ea
  playSound(frequencies.E);
Packit 1470ea
});
Packit 1470ea
A.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.A);
Packit 1470ea
});
Packit 1470ea
D.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.D);
Packit 1470ea
});
Packit 1470ea
G.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.G);
Packit 1470ea
});
Packit 1470ea
B.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.B);
Packit 1470ea
});
Packit 1470ea
e.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.e);
Packit 1470ea
});
Packit 1470ea
   

Η μέθοδος σύνδεσης κουμπιού πατά το playSound με τη σωστή μελωδία γίνεται χρησιμοποιώντας τη μέθοδο σύνδεσης του γραφικού στοιχείου κουμπιού. Έτσι επιλέγουμε ένα κουμπί να συνδεθεί και πληκτρολογούμε E.connect("clicked", function(){playSound(frequencies.E);}); Το connect λέει ότι όταν πατάμε Ε, κάτι θα συμβεί. Το clicked λέει τον τύπο του σήματος που κάτι συμβαίνει στο Ε και έπειτα στη function(){}; καλούμε το playSound με τη σωστή μελωδία που μπορεί να συσχετιστεί με το κουμπί.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="guitarjs">
Packit 1470ea
    <title>Όλο το πρόγραμμα</title>
Packit 1470ea
    

Έτσι αυτό είναι πώς δείχνουν όλα τα ενωμένα τμήματα. Όταν τρέχει αυτός ο κώδικας, θα μπορούσατε να συντονίσετε την κιθάρα σας (εάν έχετε σωστά βαθμονομημένα ηχεία).

Packit 1470ea
      
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
var Gst = imports.gi.Gst;
Packit 1470ea
Packit 1470ea
const Mainloop = imports.mainloop;
Packit 1470ea
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
Gst.init(null, 0);
Packit 1470ea
Packit 1470ea
var guitarwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL, border_width: 100});
Packit 1470ea
guitarwindow.title = "Guitar Tuner";
Packit 1470ea
guitarwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
Packit 1470ea
var guitar_box = new Gtk.ButtonBox ({orientation: Gtk.Orientation.VERTICAL, spacing: 10});
Packit 1470ea
Packit 1470ea
var E = new Gtk.Button({label: "E"});
Packit 1470ea
var A = new Gtk.Button({label: "A"});
Packit 1470ea
var D = new Gtk.Button({label: "D"});
Packit 1470ea
var G = new Gtk.Button({label: "G"});
Packit 1470ea
var B = new Gtk.Button({label: "B"});
Packit 1470ea
var e = new Gtk.Button({label: "e"});
Packit 1470ea
Packit 1470ea
var frequencies = {E: 329.63, A: 440,	D: 587.33,	G: 783.99,	B: 987.77,	e: 1318.5}
Packit 1470ea
Packit 1470ea
Packit 1470ea
function playSound(frequency){
Packit 1470ea
  var pipeline = new Gst.Pipeline({name: "note"});
Packit 1470ea
Packit 1470ea
  var source = Gst.ElementFactory.make("audiotestsrc","source");
Packit 1470ea
  var sink = Gst.ElementFactory.make("autoaudiosink","output");
Packit 1470ea
Packit 1470ea
  source.set_property('freq', frequency);
Packit 1470ea
  pipeline.add(source);
Packit 1470ea
  pipeline.add(sink);
Packit 1470ea
  source.link(sink);
Packit 1470ea
  pipeline.set_state(Gst.State.PLAYING);
Packit 1470ea
Packit 1470ea
  Mainloop.timeout_add(500, function () {
Packit 1470ea
    pipeline.set_state(Gst.State.NULL);
Packit 1470ea
	  return false;
Packit 1470ea
});
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
E.connect("clicked", function() {
Packit 1470ea
  playSound(frequencies.E);
Packit 1470ea
});
Packit 1470ea
A.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.A);
Packit 1470ea
});
Packit 1470ea
D.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.D);
Packit 1470ea
});
Packit 1470ea
G.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.G);
Packit 1470ea
});
Packit 1470ea
B.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.B);
Packit 1470ea
});
Packit 1470ea
e.connect("clicked", function(){
Packit 1470ea
  playSound(frequencies.e);
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
guitar_box.add(E);
Packit 1470ea
guitar_box.add(A);
Packit 1470ea
guitar_box.add(D);
Packit 1470ea
guitar_box.add(G);
Packit 1470ea
guitar_box.add(B);
Packit 1470ea
guitar_box.add(e);
Packit 1470ea
Packit 1470ea
guitarwindow.add(guitar_box);
Packit 1470ea
Packit 1470ea
guitar_box.show_all();
Packit 1470ea
guitarwindow.show();
Packit 1470ea
Gtk.main();
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
<section id="terminal">
Packit 1470ea
  <title>Εκτέλεση της εφαρμογής από τερματικό</title>
Packit 1470ea
  

Για να τρέξετε αυτήν την εφαρμογή ανοίξτε τον τερματικό, πηγαίνετε στον φάκελο όπου είναι αποθηκευμένη η εφαρμογή σας και μετά τρέξτε την

<screen> <output style="prompt">$ </output><input> GJS_PATH=`pwd` gjs guitarTuner.js</input> </screen>
Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
 <title>Υλοποίηση αναφοράς</title>
Packit 1470ea
 

Αν αντιμετωπίσετε προβλήματα με το μάθημα, συγκρίνετε τον κώδικά σας με αυτόν τον <link href="guitar-tuner/guitar-tuner.js">κώδικα αναφοράς</link>.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
Packit 1470ea
</page>