Ubuntu – Where can I find a metronome for music practice

application-developmentmusicsoftware-recommendationsound

This is somehow a follow up of this question:

How can I detect the BPM (beats per minute) of a song?

But now instead of detecting them in songs, I want to generate them.


I am looking for an application that will output a sound (something short like a beep) a configurable number of times per minute.

If I say 20bpm, it will output that sound every 3 seconds. (60/20)
If 60bpm, every sec.
If 120bpm every half a sec.

The reason for this is that I am learning how to play drum sets and the bpm looks really important. I am following this video on youtube.

update

Seems they are called metronomes and even Google got one. Cool Stuff.
https://www.google.com/search?q=metronomes
Thanks Nick.

Best Answer

  • As mentioned in a comment, I couldn't get the mentioned metronomes (existing for Linux/Ubuntu) working on 16.04, at least not out of the box. I didn't spend much time in getting it to work, since practically all of them give the impression to be abandoned.

    Time to write one...


    This answer (work in progress) should eventually lead to a metronome, including GUI. A good time to mention possible features you'd like.

    1. CLI metronome

    Creating a straightforward metronome turns out to be shockingly simple:

    #!/usr/bin/env python3
    import subprocess
    import sys
    import time
    
    bpm = int(sys.argv[1])
    pauze = 60/bpm
    
    while True:
        time.sleep(pauze)
        subprocess.Popen(["ogg123", "/usr/share/sounds/ubuntu/stereo/bell.ogg"])
    

    How to use

    1. The metronome needs vorbis-tools, to play the sound

      sudo apt-get install vorbis-tools
      
    2. Copy the script above into an empty file, save it as metronome.py
    3. Run it with the bpm as argument:

      python3 /path/to/metronome.py <bpm>
      

      e.g.:

      python3 /path/to/metronome.py 100
      

      To run it with 100 beats per minute

    Note

    For the sound, I used the file /usr/share/sounds/ubuntu/stereo/bell.ogg, which should be on your system by default (tested 14.04/16.04). You can however use any (.ogg) sample you like. In the final version, A number of options (sounds) will be available.


    2. Shockingly simple GUI version

    As a next step, a very basic version, the last version without an installer:

    enter image description here

    The script

    #!/usr/bin/env python3
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    import sys
    import subprocess
    import time
    from threading import Thread
    import os
    
    path = os.path.dirname(os.path.realpath(__file__))
    
    class MetroWindow(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, title="Shockingly simple Metronome")
            self.speed = 70
            self.run = False
            # maingrid
            maingrid = Gtk.Grid()
            maingrid.set_column_homogeneous(True)
            maingrid.set_row_homogeneous(False)
            maingrid.set_border_width(30)
            self.add(maingrid)
            # icon
            image = Gtk.Image(xalign=0)
            image.set_from_file(os.path.join(path, "icon.png"))
            maingrid.attach(image, 0, 0, 1, 1)
            # vertical slider,  initial value, min, max, step, page, psize
            self.v_scale = Gtk.Scale(
                orientation=Gtk.Orientation.VERTICAL,
                adjustment=Gtk.Adjustment.new(self.speed, 10, 240, 1, 0, 0)
                )
            self.v_scale.set_vexpand(True)
            self.v_scale.set_digits(0)
            self.v_scale.connect("value-changed", self.scale_moved)
            maingrid.attach(self.v_scale, 1, 0, 2, 1)
    
            self.togglebutton = Gtk.Button("_Run", use_underline=True)
            self.togglebutton.connect("clicked", self.time_out)
            self.togglebutton.set_size_request(70,20)
            maingrid.attach(self.togglebutton, 3, 3, 1, 1)
    
            # start the thread
            self.update = Thread(target=self.run_metro, args=[])
            self.update.setDaemon(True)
            self.update.start()
    
        def scale_moved(self, event):
            self.speed = int(self.v_scale.get_value())
    
        def time_out(self, *args):
            if self.run == True:
                self.run = False
                self.togglebutton.set_label("Run")
            else:
                self.run = True
                self.togglebutton.set_label("Pauze")
    
        def pauze(self):
            return 60/self.speed
    
        def run_metro(self):
            soundfile = "/usr/share/sounds/ubuntu/stereo/bell.ogg"
            while True:
                if self.run == True:
                    subprocess.Popen([
                        "ogg123", soundfile
                        ])
                time.sleep(self.pauze())
    
    def run_gui():
        window = MetroWindow()
        window.connect("delete-event", Gtk.main_quit)
        window.set_resizable(False)
        window.show_all()
        Gtk.main()
    
    run_gui()
    

    The image

    enter image description here

    How to use

    1. Like the cli version, this one needs vorbis-tools:

      sudo apt-get install vorbis-tools
      
    2. Copy the script into an empty file, save it as metro.py

    3. Right- click on the image above, save it In one and the same directory as the script (exactly) as: icon.png.
    4. Simply run the metronome by the command:

      python3 /path/to/metro.py
      

    3. PPA for the Orange Metronome

    It is done!

    The metronome is ready for installation.
    The Orange Metronome comes with a set of different sounds to choose from, and the beats can be grouped. All changes are applied immediately on the running metronome:

    enter image description here

    enter image description here

    enter image description here

    To install:

    sudo apt-add-repository ppa:vlijm/orangemetronome
    sudo apt-get update
    sudo apt-get install orangemetronome
    

    Work to do

    • Currently, the metronome comes with four different sounds to choose from. Probably a few will be added in the next few days, some of them will be replaced/updated

    • On the longer term
      For the longer term, I am thinking of adding the option for (custom) complex structures like 3+3+2, 2+2+2+3 etc., which I always missed in existing metronomes.

    Finally

    The latest (current) version 0.5.3 adds a number of sounds, but more importantly, the option to run irregular (composite) beats. In this version, they are hard coded. Will be customizable from version > 1.

    enter image description here