Blob Blame History Raw
<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="guitar-tuner.cpp" xml:lang="el">

  <info>
    <link type="guide" xref="cpp#examples"/>

    <desc>Χρησιμοποιήστε Gtk+ και GStreamer για να κατασκευάσετε μια απλή εφαρμογή συντονιστή κιθάρας για το GNOME. Αναδεικνύοντας τη χρήση του σχεδιαστή διεπαφών.</desc>

    <revision pkgversion="0.1" version="0.1" date="2011-03-17" status="review"/>
    <credit type="author">
      <name>Έργο τεκμηρίωσης GNOME</name>
      <email its:translate="no">gnome-doc-list@gnome.org</email>
    </credit>
    <credit type="author">
      <name>Johannes Schmid</name>
      <email its:translate="no">jhs@gnome.org</email>
    </credit>
    <credit type="editor">
      <name>Marta Maria Casetti</name>
      <email its:translate="no">mmcasetti@gmail.com</email>
      <years>2013</years>
    </credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
      <mal:email>team@gnome.gr</mal:email>
      <mal:years>2012-2015</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Δημήτρης Σπίγγος</mal:name>
      <mal:email>dmtrs32@gmail.com</mal:email>
      <mal:years>2012, 2013</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Μαρία Θουκιδίδου</mal:name>
      <mal:email>marablack3@gmail.com</mal:email>
      <mal:years>2014</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Θάνος Τρυφωνίδης</mal:name>
      <mal:email>tomtryf@gmail.com</mal:email>
      <mal:years>2014, 2015</mal:years>
    </mal:credit>
  </info>

<title>Συντονιστής κιθάρας</title>

<synopsis>
  <p>Σε αυτόν τον οδηγό, θα φτιάξουμε ένα πρόγραμμα που παίζει μουσικούς τόνους και μπορεί να συντονίσει μια κιθάρα. Θα μάθετε να:</p>
  <list>
    <item><p>Ρυθμίζετε το κύριο έργο στο Anjuta</p></item>
    <item><p>Δημιουργείτε απλό GUI με τον σχεδιαστή UI του Anjuta</p></item>
    <item><p>Χρησιμοποιείτε το GStreamer για να παίζετε ήχους</p></item>
  </list>
  <p>Θα χρειαστείτε τα παρακάτω για να μπορέσετε να ακολουθήσετε αυτό το μάθημα:</p>
  <list>
    <item><p>Ένα εγκατεστημένο αντίγραφο του <link xref="getting-ready">Anjuta IDE</link></p></item>
    <item><p>Βασική γνώση της γλώσσας προγραμματισμού C++</p></item>
  </list>
</synopsis>

<media type="image" mime="image/png" src="media/guitar-tuner.png"/>

<section id="anjuta">
  <title>Δημιουργία έργου με το Anjuta</title>
  <p>Πριν ξεκινήσετε να προγραμματίζετε, πρέπει να δημιουργήσετε ένα καινούργιο έργο στο Anjuta. Έτσι θα δημιουργηθούν όλα τα απαραίτητα αρχεία που χρειάζονται για την εκτέλεση του κώδικα αργότερα. Επίσης θα ήταν χρήσιμο να τα κρατάτε όλα μαζί.</p>
  <steps>
    <item>
    <p>Ξεκινήστε το Anjuta και πατήστε <guiseq><gui>αρχείο</gui><gui>νέο</gui><gui>έργο</gui></guiseq> για να ανοίξετε τον οδηγό του έργου.</p>
    </item>
    <item>
    <p>Επιλέξτε <gui>GTKmm (απλό)</gui> από την καρτέλα <gui>C++</gui>, κλικ <gui>μπροστά</gui> και συμπληρώστε τις λεπτομέρειές σας στις επόμενες λίγες σελίδες. Χρησιμοποιήστε ως όνομα του έργου και του καταλόγου το <file>guitar-tuner</file>.</p>
   	</item>
    <item>
    <p>Βεβαιωθείτε ότι το <gui>ρύθμιση εξωτερικών πακέτων</gui> επιλέχτηκε. Στην επόμενη σελίδα, επιλέξτε <em>gstreamer-0.10</em> από τη λίστα για συμπερίληψη της βιβλιοθήκης GStreamermm στο έργο σας.</p>
    </item>
    <item>
    <p>Πατήστε <gui>τέλος</gui> και το έργο θα δημιουργηθεί για σας. Ανοίξτε <file>src/main.cc</file> από τις καρτέλες <gui>έργο</gui> ή <gui>αρχείο</gui>. Θα πρέπει να δείτε κάποιο κώδικα που ξεκινάει με τις γραμμές:</p>
    <code mime="text/x-csrc">
#include &lt;gtkmm.h&gt;
#include &lt;iostream&gt;</code>
    </item>
  </steps>
</section>

<section id="build">
  <title>Κατασκευάστε τον κώδικα για πρώτη φορά</title>
  <p>Αυτός είναι ένας πολύ βασικός κώδικας C++ εγκατάστασης GTKmm. Περισσότερες λεπτομέρειες δίνονται παρακάτω· προσπεράστε αυτή τη λίστα αν καταλαβαίνετε τα βασικά:</p>
  <list>
  <item>
    <p>Οι τρεις γραμμές <code>#include</code> στην κορυφή περιλαμβάνουν τον <code>config</code> (ορίζει χρήσιμη κατασκευή του autoconf), <code>gtkmm</code> (διεπαφή χρήστη) και <code>iostream</code> (STL). Συναρτήσεις από αυτές τις βιβλιοθήκες χρησιμοποιούνται στον υπόλοιπο κώδικα.</p>
   </item>
   <item>
    <p>Η συνάρτηση <code>Main</code> δημιουργεί ένα νέο παράθυρο ανοίγοντας ένα αρχείο GtkBuilder (<file>src/guitar-tuner.ui</file>, που ορίζεται λίγες γραμμές παραπάνω), και έπειτα εμφανίζοντας το σε παράθυρο. Το αρχείο GtkBuilder περιέχει μια περιγραφή μιας διεπαφής χρήστη και όλων των στοιχείων του. Μπορείτε να χρησιμοποιήσετε τον επεξεργαστή του Anjuta για σχεδίαση διεπαφών χρήστη GtkBuilder.</p>
   </item>
   <item>
    <p>Κατόπιν καλεί λίγες συναρτήσεις που ρυθμίζουν και έπειτα εκτελούν την εφαρμογή. Η συνάρτηση <code>kit.run</code> ξεκινά τον κύριο βρόχο του GTK, που εκτελεί τη διεπαφή χρήστη και ξεκινά την απάντηση για συμβάντα (όπως κλικ και πατήματα κουμπιών).</p>
   </item>
  </list>

  <p>Αυτός ο κώδικας είναι έτοιμος να χρησιμοποιηθεί, οπότε μπορείτε να τον μεταγλωττίσετε με κλικ <guiseq><gui>κατασκευή</gui><gui>κατασκευή έργου</gui></guiseq> (ή πιέζοντας <keyseq><key>Shift</key><key>F7</key></keyseq>).</p>
  <p>Πατήστε <gui>Execute</gui> στο επόμενο παράθυρο που εμφανίζεται για ρύθμιση κατασκευής αποσφαλμάτωσης. Χρειάζεται να το κάνετε αυτό μόνο μια φορά, για την πρώτη κατασκευή.</p>
</section>

<section id="ui">
  <title>Δημιουργία της διεπαφής χρήστη</title>
  <p>Μια περιγραφή της διεπαφής χρήστη (UI) περιέχεται στο αρχείο GtkBuilder. Για να επεξεργαστείτε τη διεπαφή χρήστη, ανοίξτε το <file>src/guitar_tuner.ui</file>. Θα βρεθείτε στο σχεδιαστή διεπαφής. Το παράθυρο σχεδίασης είναι στο κέντρο· τα γραφικά στοιχεία και οι ρυθμίσεις τους είναι στα αριστερά, η παλέτα με τα διαθέσιμα γραφικά στοιχεία στα δεξιά.</p>
  <p>Η διάταξη κάθε διεπαφής χρήστη σε Gtk+ οργανώνεται σε κουτιά και πίνακες. Ας χρησιμοποιήσουμε εδώ ένα κάθετο <gui>GtkButtonBox</gui> για να τοποθετήσουμε έξι <gui>GtkButtons</gui>, ένα για κάθε μία από τις χορδές της κιθάρας.</p>

<media type="image" mime="image/png" src="media/guitar-tuner-glade.png"/>

  <steps>
   <item>
   <p>Διαλέξτε ένα <gui>GtkButtonBox</gui> από το τμήμα <gui>Container</gui> στην <gui>Παλέτα</gui> στο δεξιά και προσθέστε το στο παράθυρο. Στο φάτνωμα <gui>Ιδιότητες</gui> καθορίστε τον αριθμό των στοιχείων σε 6 (για τις έξι χορδές της κιθάρας) και τον προσανατολισμό σε κάθετο.</p>
   </item>
   <item>
    <p>Τώρα, διαλέξτε ένα <gui>GtkButton</gui> από την παλέτα και βάλτε το στο πρώτο μέρος του κουτιού.</p>
   </item>
   <item>
    <p>Έχοντας το κουμπί ακόμα επιλεγμένο, αλλάξτε την ιδιότητα <gui>ετικέτα</gui> στην καρτέλα <gui>γραφικά στοιχεία</gui> σε <gui>E</gui>. Αυτή θα είναι η χαμηλή χορδή Ε. Επίσης αλλάξτε την ιδιότητα <gui>όνομα</gui> σε <gui>button_E</gui>. Με αυτό το όνομα θα αναφερθούμε στο γραφικό στοιχείο αργότερα στον κώδικα.</p>
    </item>
    <item>
    <p>Επαναλάβετε τα παραπάνω βήματα για τα υπόλοιπα κουμπιά, προσθέστε τις επόμενες 5 χορδές με τις ετικέτες <em>A</em>, <em>D</em>, <em>G</em>, <em>B</em>, και <em>e</em> και τα ονόματα <em>button_A</em>, κλπ.</p>
    </item>
    <item>
    <p>Αποθηκεύστε τη σχεδίαση UI (πατώντας <guiseq><gui>αρχείο</gui><gui>αποθήκευση</gui></guiseq>) και κλείστε το αρχείο.</p>
    </item>
  </steps>
</section>

<section id="gst">
  <title>Διοχετεύσεις GStreamer</title>
  <p>Το Gtreamer είναι ο σκελετός πολυμέσων του GNOME — μπορείτε να το χρησιμοποιήσετε για να αναπαραγωγή ηχογράφηση και επεξεργασία βίντεο, ήχου, ροών ιστοκάμερας και τα παρόμοια. Εδώ, θα το χρησιμοποιήσουμε για να παράξουμε μονές συχνότητες τόνων. Το GStreamermm είναι ένας σύνδεσμος C++ στο GStreamer που θα χρησιμοποιήσουμε εδώ.</p>
  <p>Εννοιολογικά, το GStreamer λειτουργεί ως εξής: δημιουργείς μια <em>διοχέτευση</em> που περιέχει διάφορα επεξεργαζόμενα στοιχεία που πηγαίνουν από την <em>πηγή</em> στην <em>έξοδο</em>. Η πηγή μπορεί να είναι ένα αρχείο εικόνας, βίντεο, ή και μουσικής, για παράδειγμα, και η έξοδος μπορεί να είναι ένα γραφικό στοιχείο ή η κάρτα ήχου.</p>
  <p>Ανάμεσα στην πηγή και στην έξοδο, μπορείτε να εφαρμόσετε διάφορα φίλτρα και οι μετατροπείς να χειριστούν εφέ, μετατροπές μορφών και λοιπά. Κάθε στοιχείο της διοχέτευσης έχει ιδιότητες που μπορούν να χρησιμοποιηθούν για να αλλάξουν τη συμπεριφορά τους.</p>
  <media type="image" mime="image/png" src="media/guitar-tuner-pipeline.png">
    <p>Ένα παράδειγμα διοχέτευσης GStreamer.</p>
  </media>
</section>

<section id="usinggst">
  <title>Χρήση GStreamermm</title>
  <p>Για να χρησιμοποιήσετε το GStreamermm, πρέπει να αρχικοποιηθεί. Το κάνουμε αυτό προσθέτοντας την παρακάτω γραμμή του κώδικα δίπλα στη γραμμή <code>Gtk::Main kit(argc, argv);</code> στο <file>main.cc</file>:</p>
  <code>	Gst::init (argc, argv);</code>
  <p>Ενώ είμαστε σε αυτό, βεβαιωθείτε επίσης ότι το <file>gstreamermm.h</file> περιέχεται κατάλληλα στο <file>main.cc</file>.</p>

  <p>Σε αυτό το απλό παράδειγμα θα χρησιμοποιήσουμε μια πηγή παραγωγής τόνων, την <code>audiotestsrc</code> και θα στείλουμε την έξοδο στην προεπιλεγμένη συσκευή ήχου του συστήματος, <code>autoaudiosink</code>. Πρέπει μόνο να ρυθμίσουμε την συχνότητα της παραγωγής τόνου· αυτό είναι εφικτό μέσα από την ρύθμιση <code>freq</code> του <code>audiotestsrc</code>.</p>

  <p>Για απλοποίηση του χειρισμού της διοχέτευσης θα ορίσουμε μια βοηθητική κλάση <code>Sound</code>. Το κάνουμε στο <file>main.cc</file> για να κρατήσουμε αυτό το παράδειγμα απλό, ενώ ίσως συνήθως να θέλατε να το χρησιμοποιήσετε σε ξεχωριστό αρχείο:</p>
  <code>
class Sound
{
	public:
		Sound();

		void start_playing(double frequency);
		bool stop_playing();

	private:
		Glib::RefPtr&lt;Gst::Pipeline&gt; m_pipeline;
		Glib::RefPtr&lt;Gst::Element&gt; m_source;
		Glib::RefPtr&lt;Gst::Element&gt; m_sink;
};

Sound::Sound()
{
	m_pipeline = Gst::Pipeline::create("note");
	m_source = Gst::ElementFactory::create_element("audiotestsrc",
	                                               "source");
	m_sink = Gst::ElementFactory::create_element("autoaudiosink",
	                                             "output");
	m_pipeline-&gt;add(m_source);
	m_pipeline-&gt;add(m_sink);
	m_source-&gt;link(m_sink);
}

void Sound::start_playing (double frequency)
{
	m_source-&gt;set_property("freq", frequency);
	m_pipeline-&gt;set_state(Gst::STATE_PLAYING);

	/* stop it after 200ms */
	Glib::signal_timeout().connect(sigc::mem_fun(*this, &amp;Sound::stop_playing),
	                               200);
}

bool Sound::stop_playing()
{
	m_pipeline-&gt;set_state(Gst::STATE_NULL);
	return false;
}
</code>

  <p>Ο κώδικας έχει τον παρακάτω σκοπό:</p>
  <steps>
    <item>
    <p>Στον κατασκευαστή, τα στοιχεία πηγής και εξόδου του GStreamer (<code>Gst::Element</code>)δημιουργούνται και ένα στοιχείο διοχέτευσης (το οποίο θα χρησιμοποιηθεί ως περιέκτης για τα δυο άλλα στοιχεία). Δίνουμε το όνομα "note" στη διοχέτευση· ονομάζουμε την πηγή "source" και ρυθμίζεται στην πηγή <code>audiotestsrc</code>· και ονομάζουμε την έξοδο "output" και την ρυθμίζετε στην έξοδο <code>autoaudiosink</code> (προεπιλεγμένη έξοδος κάρτας ήχου). Αφού τα στοιχεία προστεθούν στη διοχέτευση και συνδεθούν μαζί, η σωλήνωση είναι έτοιμη να τρέξει.</p>
    </item>
    <item>
    <p>Ο <code>start_playing</code> ορίζει το στοιχείο πηγής να αναπαράγει μια συγκεκριμένη συχνότητα και έπειτα ξεκινά τη διοχέτευση ώστε ο ήχος στην πραγματικότητα να ξεκινήσει αναπαραγωγή. Καθώς δεν θέλουμε να έχουμε τον ενοχλητικό ήχο για πολύ, ορίζεται μια λήξη χρόνου για να σταματήσει τη διοχέτευση μετά από 200 ms καλώντας <code>stop_playing</code>.</p>
    </item>
    <item>
    <p>Στον <code>stop_playing</code> που καλείται όταν η λήξη χρόνου περάσει, η διοχέτευση σταματά και έτσι δεν υπάρχει κανένας ήχος εξόδου πια. Καθώς το GStreamermm χρησιμοποιεί μετρητή αναφοράς μέσα από το αντικείμενο <code>Glib::RefPtr</code>, η μνήμη αυτόματα ελευθερώνεται μόλις η κλάση <code>Sound</code> καταστραφεί.</p>
    </item>
  </steps>
</section>

<section id="signals">
  <title>Σύνδεση σημάτων</title>
  <p>Θέλουμε να παίξουμε τον σωστό ήχο, όταν ο χρήστης πατά ένα κουμπί. Αυτό σημαίνει ότι πρέπει να συνδεθούμε στο σήμα που ξεκινά όταν ο χρήστης πατά το κουμπί. Θέλουμε επίσης να δώσουμε πληροφορίες στην καλούμενη συνάρτηση ποιο τόνο να παίξει. Το GTKmm το κάνει αρκετά απλό καθώς μπορούμε εύκολα να συνδέσουμε πληροφορίες με τη βιβλιοθήκη <em>sigc</em>.</p>

  <p>Η συνάρτηση που καλείται όταν ο χρήστης πατά ένα κουμπί μπορεί να είναι αρκετά απλή, καθώς όλο το ενδιαφέρον υλικό γίνεται τώρα στη βοηθητική κλάση:</p>
  <code mime="text/x-csrc">
static void
on_button_clicked(double frequency, Sound* sound)
{
	sound-&gt;start_playing (frequency);
}
</code>
  <p>Καλεί μόνο τη βοηθητική κλάση που ορίσαμε πριν να παίξει τις σωστές συχνότητες. Με κάποια επιπλέον κώδικα θα μπορούσαμε επίσης να μπορέσουμε την άμεση σύνδεση στην κλάση χωρίς χρήση της συνάρτησης, αλλά θα το αφήσουμε να χρησιμοποιηθεί ως άσκηση.</p>

  <p>Ο κώδικας για ρύθμιση των σημάτων πρέπει να προστεθεί στη συνάρτηση <code>main()</code> αμέσως μετά τη γραμμή <code>builder-&gt;get_widget("main_window", main_win);</code>:</p>
  <code mime="text/x-csrc">
Sound sound;
Gtk::Button* button;

builder-&gt;get_widget("button_E", button);
button-&gt;signal_clicked().connect (sigc::bind&lt;double, Sound*&gt;(sigc::ptr_fun(&amp;on_button_clicked),
                                              329.63, &amp;sound));
</code>
	<steps>
	<item>
	<p>Πρώτα δημιουργούμε ένα στιγμιότυπο της βοηθητικής μας κλάσης που θέλουμε να χρησιμοποιήσουμε τώρα και δηλώνουμε μια μεταβλητή για το κουμπί στο οποίο θέλουμε να συνδεθούμε.</p>
	</item>
	<item>
	<p>Κατόπιν, δεχόμαστε το αντικείμενο κουμπιού από τη διεπαφή χρήστη που δημιουργήθηκε από το αρχείο διεπαφής χρήστη. Να θυμάστε ότι <em>button_E</em> είναι το όνομα που δώσαμε στο πρώτο κουμπί.</p>
	</item>
	<item>
	<p>Τελικά συνδέουμε το σήμα <em>πατημένο</em>. Αυτό δεν είναι πλήρως κατανοητό επειδή αυτό γίνεται με έναν πλήρη τρόπο ασφαλούς τύπου και στην πραγματικότητα θέλουμε να περάσουμε τη συχνότητα και τη βοηθητική μας κλάση στο χειριστή σήματος. Ο <code>sigc::ptr_fun(&amp;on_button_clicked)</code> δημιουργεί μια <em>υποδοχή</em> για τη μέθοδο <code>on_button_clicked</code> που ορίσαμε παραπάνω. Με τον <code>sigc::bind</code> μπορούμε να περάσουμε πρόσθετα ορίσματα στην υποδοχή και σε αυτήν την περίπτωση περνάμε τη συχνότητα (ως διπλή) και τη βοηθητική μας κλάση.</p>
	</item>
  </steps>
  <p>Τώρα που ρυθμίσαμε το κουμπί <em>E</em> θα χρειαστούμε επίσης να συνδέσουμε τα άλλα κουμπιά σύμφωνα με τις συχνότητές τους: 440 για A, 587.33 για D, 783.99 για G, 987.77 για B και 1318.5 για την υψηλή Ε. Αυτό γίνεται με τον ίδιο τρόπο, απλά περνώντας μια διαφορετική συχνότητα στον χειριστή.</p>
</section>

<section id="run">
  <title>Κατασκευή και εκτέλεση της εφαρμογής</title>
  <p>Όλος ο κώδικας πρέπει να είναι έτοιμος τώρα. Κλικ <guiseq><gui>κατασκευή</gui><gui>κατασκευή έργου</gui></guiseq> για ανακατασκευή των πάντων και έπειτα <guiseq><gui>τρέξιμο</gui><gui>τρέξιμο</gui></guiseq> για έναρξη της εφαρμογής.</p>
  <p>Εάν δεν το έχετε ήδη κάνει, επιλέξτε την εφαρμογή <file>Debug/src/guitar-tuner</file> στον διάλογο που εμφανίζεται. Τελικά, πατήστε <gui>τρέξιμο</gui> και απολαύστε!</p>
</section>

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

<section id="further">
  <title>Περαιτέρω ανάγνωση</title>
  <p>Πολλά από τα πράγματα που εμφανίστηκαν παραπάνω εξηγούνται με λεπτομέρεια στο <link href="http://library.gnome.org/devel/gtkmm-tutorial/stable/">βιβλίο GTKmm</link> που επίσης καλύπτει πολύ περισσότερες βασικές έννοιες χρήσης όλης της δύναμης του GTKmm. Ίσως επίσης ενδιαφέρεστε για την <link href="http://library.gnome.org/devel/gstreamermm/">τεκμηρίωση αναφοράς GStreamermm</link>.</p>
</section>

<section id="next">
  <title>Επόμενα βήματα</title>
  <p>Εδώ είναι κάποιες ιδέες για το πώς μπορείτε να επεκτείνετε αυτή την απλή παρουσίαση:</p>
  <list>
   <item>
   <p>Βάλτε το πρόγραμμα να περνάει αυτόματα μέσα από τις νότες.</p>
   </item>
   <item>
   <p>Κάντε το πρόγραμμα να αναπαράγει ηχογραφήσεις από αληθινές χορδές κιθάρας που έχουν εισαχθεί.</p>
   <p>Για να το κάνετε αυτό, πρέπει να ρυθμίσετε μια πιο περίπλοκη διοχέτευση GStreamer που θα σας επιτρέπει να φορτώνετε και να αναπαράγετε αρχεία ήχου. Θα πρέπει να διαλέξετε τα στοιχεία GStreamer <link href="http://gstreamer.freedesktop.org/documentation/plugins.html">decoder και demuxer</link> με βάση τον τύπο του αρχείου των ηχογραφημένων ήχων — για παράδειγμα το MP3 χρησιμοποιεί διαφορετικά στοιχεία από το Ogg Vorbis.</p>
   <p>Ίσως χρειαστεί να συνδέσετε τα στοιχεία με πιο περίπλοκους τρόπους. Αυτό μπορεί να συμπεριλαμβάνει τη χρήση <link href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-intro-basics.html">Εννοιών GStreamer</link> που δεν καλύπτουμε σε αυτόν τον οδηγό, όπως και <link href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-intro-basics-pads.html">pad</link>. Ίσως βρείτε χρήσιμη και την εντολή <cmd>gst-inspect</cmd>.</p>
   </item>
   <item>
   <p>Αυτόματη ανάλυση νότων που παίζει ο χρήστης.</p>
   <p>Μπορείτε να συνδέσετε μικρόφωνο και να ηχογραφήσετε από αυτό χρησιμοποιώντας την <link href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-autoaudiosrc.html">πηγή εισόδου</link>. Ίσως κάποια μορφή της <link href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-plugin-spectrum.html">ανάλυσης φάσματος</link> θα σας βοηθούσε να καταλάβετε ποια νότα παίζει;</p>
   </item>
  </list>
</section>

</page>