Blame platform-demos/es/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="es">
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Afinador de guitarra (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>Usar GTK+ y GStreamer para construir un sencillo afinador de guitarra para GNOME.</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Daniel Mustieles</mal:name>
Packit 1470ea
      <mal:email>daniel.mustieles@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011 - 2017</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>Nicolás Satragno</mal:name>
Packit 1470ea
      <mal:email>nsatragno@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>Jorge González</mal:name>
Packit 1470ea
      <mal:email>jorgegonz@svn.gnome.org</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>Afinador de guitarra</title>
Packit 1470ea
Packit 1470ea
    <synopsis>
Packit 1470ea
      

En este tutorial se construirá una pequeña aplicación, «Afinador de guitarra», usando JavaScript, GTK+ y GStreamer. Para escribirla y poder ejecutar los ejemplos, necesitará un editor en el que escribir el código, una terminal y GNOME 3 o superior instalado en su equipo.

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

<link xref="#gstreamer">Tuberías de GStreamer</link>

</item>
Packit 1470ea
      <item>

<link xref="#script">Script para ejecutar la aplicación</link>

</item>
Packit 1470ea
      <item>

<link xref="#imports">Bibliotecas que importar</link>

</item>
Packit 1470ea
      <item>

<link xref="#mainwindow">Crear la ventana principal de la aplicación</link>

</item>
Packit 1470ea
      <item>

<link xref="#buttons">Botones para las melodías</link>

</item>
Packit 1470ea
      <item>

<link xref="#playSound">Crear sonidos con GStreamer</link>

</item>
Packit 1470ea
      <item>

<link xref="#connecting">Conectar los botones a playSound</link>

</item>
Packit 1470ea
      <item>

<link xref="#guitarjs">El programa completo</link>

</item>
Packit 1470ea
      <item>

<link xref="#terminal">Ejecutar la aplicación desde la terminal</link>

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

Después de leer este tutorial, debería ver esto en su pantalla:

Packit 1470ea
  <media type="image" mime="image/png" src="media/guitar-tuner.png"/>
Packit 1470ea
  <section id="gstreamer">
Packit 1470ea
    <title>Tuberías de Gstreamer</title>
Packit 1470ea
    

GStreamer es el entorno multimedia de trabajo de GNOME: puede usarlo para reproducir, grabar y procesar vídeo, sonido, flujos de la cámara web y similares. En este caso, se usará para generar tonos de frecuencia única.

Packit 1470ea
    

Conceptualmente. GStreamer funciona de la siguiente manera: puede crear una tubería que contenga varios elementos de procesado que van desde la fuente hasta el sumidero (salida). La fuente puede ser, por ejemplo, un archivo de imagen, un vídeo o un archivo de música, y la salida puede ser un widget o la tarjeta de sonido.

Packit 1470ea
    

Entre la fuente y el sumidero, puede aplicar varios filtros y conversores para manejar efectos, conversiones de formato, etc. Cada elemento de la tubería tiene propiedades que se pueden usar para cambiar este comportamiento.

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

Un ejemplo de tubería de GStreamer.

Packit 1470ea
    </media>
Packit 1470ea
  </section>
Packit 1470ea
  <section id="script">
Packit 1470ea
    <title>Script para ejecutar la aplicación</title>
Packit 1470ea
    
Packit 1470ea
  #!/usr/bin/gjs
Packit 1470ea
    

Esta línea indica cómo ejecutar el script. Debe ser la primera línea del código y debe ser ejecutable. Para obtener permisos de ejecución vaya a la terminal y ejecute lo siguiente en la carpeta adecuada: chmod +x nombrescript. También puede usar el gestor de archivo. Simplemente vaya a la carpeta donde está el código, pulse con el botón derecho sobre el archivo de código y elija «Propiedades», pulse en la pestaña «Permisos» y marque la casilla para permitir ejecutar el archivo como un programa.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Bibliotecas que importar</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
    

Para que el programa funcione se debe importar una biblioteca de introspección de GObject. Para que funcione la IU se necesita GTK+ y, para que funcione GStreamer se necesita GST. Estas bibliotecas se importan al inicio, por lo que están en uso en todos los sitios. También, al principio, se importa el constructor Mainloop para gestionar el tiempo de espera que usar para los tonos de afinación.

Packit 1470ea
    </section>
Packit 1470ea
  <section id="mainwindow">
Packit 1470ea
    <title>Crear la ventana principal de la aplicación</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
    

Importar GTK+ y Gst no es suficiente. Se necesita inicializarlos para que funcionen juntos. Cuando GTK+ y Gst estén funcionando, se debe crear la ventana para la aplicación. Más adelante se pondrán los botones para reproducir sonidos en esta ventana. Para que la ventana se muestre, es necesario decirle que se muestre y se debe ejecutar el código con la función Gtk.main().

Packit 1470ea
  </section>
Packit 1470ea
  <section id="buttons">
Packit 1470ea
   <title>Botones para los tonos</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
   

Dado que Gtk.Window sólo puede contener un único widget, se debe crear algo que pueda contener todos los botones necesarios. En este ejemplo se usa Buttonbox. Después de crear la Buttonbox, se crean los botones con las etiquetas necesarias. Una vez creados los botones necesarios, es necesario añadirlos a la Buttonbox, que se debe añadir a la Gtk.Window, y se mostrará todo el contenido de la Buttonbox.

Packit 1470ea
   

Después de esto debería tener en su pantalla una ventana con 6 botones. De momento, los botones no hacen nada, esto se corregirá más adelante. Antes de poder conectar las señales de los botones a algo, es necesario codificar eso primero.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="playSound">
Packit 1470ea
   <title>Crear sonidos con 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
   

Lo primero que se debe hacer es decidir qué tonos se quieren reproducir con la función playSound. A la función playSound se le pasa como argumento una frecuencia (que se ha definido en la lista de variables). Lo primero que se debe hacer es construir una tubería, con una fuente y un sumidero. Para la fuente se establece la frecuencia. A la tubería se añaden la fuente y el sumidero y se indica que la reproduzca. El último paso es usar la constante Mainloop para hacer que la tubería se pare después de 500ms.

Packit 1470ea
   

Ahora ya funciona el método para reproducir un sonido cuando se pulsa un botón. Lo siguiente es hacer las conexiones para que al pulsar un botón se reproduzca el sonido correcto para ese botón.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="connecting">
Packit 1470ea
   <title>Conectar los botones a 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
   

La forma de conectar pulsaciones del ratón a «playSound» con la melodía correcta es usar el método «connect» del widget botón. Por lo que se elije un botón que conectar y se introduce E.connect("clicked", function(){playSound(frequencies.E);}); El connect indica que cuando se pulsa «E», algo debe pasar. El clicked indica el tipo de acción sucediendo sobre «E» y después en la function(){}; se llama a «playSound» con la melodía correcta que debe asociarse al botón.

Packit 1470ea
  </section>
Packit 1470ea
  <section id="guitarjs">
Packit 1470ea
    <title>El programa completo</title>
Packit 1470ea
    

A esto se parecen todas las partes combinadas. Al ejecutar este código, debería poder afinar su guitarra (si tiene sus altavoces calibrados correctamente).

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>Ejecutar la aplicación desde la terminal</title>
Packit 1470ea
  

Para ejecutar esta aplicación ,abra una terminal, vaya a la carpeta donde está la aplicación y ejecute

<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>Implementación de referencia</title>
Packit 1470ea
 

Si tiene problemas con este tutorial, compare su código con este <link href="guitar-tuner/guitar-tuner.js">código de referencia</link>.

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