Gjs

by Daniel Pimentel — Sun 12 December 2010

Gjs is a Javascript binding for GNOME. It's mainly based on Spidermonkey javascript engine and the GObject introspection framework.

Emacs

#!/usr/bin/gjs
var Gtk = imports.gi.Gtk;
var Gst = imports.gi.Gst;

const Mainloop = imports.mainloop;

Gtk.init(null, 0);
Gst.init(null, 0);

var guitarwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL, border_width: 100});
guitarwindow.title = 'Guitar Tuner';
guitarwindow.connect('destroy', function(){Gtk.main_quit()});

var guitar_box = new Gtk.ButtonBox ({orientation: Gtk.Orientation.VERTICAL, spacing: 10});

var E = new Gtk.Button({label: 'E'});
var A = new Gtk.Button({label: 'A'});
var D = new Gtk.Button({label: 'D'});
var G = new Gtk.Button({label: 'G'});
var B = new Gtk.Button({label: 'B'});
var e = new Gtk.Button({label: 'e'});

var frequencies = {E: 329.63, A: 440,	D: 587.33,	G: 783.99,	B: 987.77,	e: 1318.5}


function playSound(frequency){
  var pipeline = new Gst.Pipeline({name: 'note'});

  var source = Gst.ElementFactory.make('audiotestsrc','source');
  var sink = Gst.ElementFactory.make('autoaudiosink','output');

  source.set_property('freq', frequency);
  pipeline.add(source);
  pipeline.add(sink);
  source.link(sink);
  pipeline.set_state(Gst.State.PLAYING);

  Mainloop.timeout_add(500, function () {
    pipeline.set_state(Gst.State.NULL);
	  return false;
});
}

E.connect('clicked', function() {
  playSound(frequencies.E);
});
A.connect('clicked', function(){
  playSound(frequencies.A);
});
D.connect('clicked', function(){
  playSound(frequencies.D);
});
G.connect('clicked', function(){
  playSound(frequencies.G);
});
B.connect('clicked', function(){
  playSound(frequencies.B);
});
e.connect('clicked', function(){
  playSound(frequencies.e);
});

guitar_box.add(E);
guitar_box.add(A);
guitar_box.add(D);
guitar_box.add(G);
guitar_box.add(B);
guitar_box.add(e);

guitarwindow.add(guitar_box);

guitar_box.show_all();
guitarwindow.show();
Gtk.main();

Shell

gjs guitarTuner.js
Gjs
2000-2016 by Daniel Pimentel under GFDL