17

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.

Parto
  • 15,325
  • 24
  • 86
  • 117
  • 1
    Audacity can do this (look under the "Generate" menu), though there are probably simpler programs. Online metronomes are plentiful, if you plan on having internet access during your practice. – Nick Weinberg Aug 20 '16 at 22:56
  • 2
    gtick, klick, gtklick, and kmetronome might be other options, and they're all available in the Ubuntu software repositories. – Nick Weinberg Aug 20 '16 at 22:58
  • The metronomes running under Linux are heavily outdated it seems. Not working, at least not out of the box. Time to write one :) @NickWeinberg I tried them all, not working (any more) it seems. – Jacob Vlijm Aug 20 '16 at 22:58
  • Hey @JacobVlijm Got a python script that can do this? I really should learn python... – Parto Aug 20 '16 at 23:01
  • I will give it a shot shortly! – Jacob Vlijm Aug 20 '16 at 23:02
  • Hey @NickWeinberg Let me check audacity and those programs out... – Parto Aug 20 '16 at 23:02
  • @JacobVlijm From the video he has 20bpm, 40, 60, 80, 100 and 120. Will appreciate and you will be in line for a bounty. – Parto Aug 20 '16 at 23:03
  • @Parto haha, while I would do it for free :). I will look into it in a short time. – Jacob Vlijm Aug 20 '16 at 23:05
  • Gtick does a good job actually but if @JacobVlijm can write another one, well and good. – Parto Aug 20 '16 at 23:39
  • @NickWeinberg Consider writing your comment as an answer for a +1 from me. – Parto Aug 20 '16 at 23:40

6 Answers6

26

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

Jacob Vlijm
  • 83,767
9

It sounds like you're looking for a metronome!

The audio-editing software Audacity can generate a steady, metronome-like beat or tone (look under the "Generate" menu), though there are simpler programs that I'll list below. Audacity is in the Ubuntu software repositories and can be installed through the Software Center or by typing sudo apt install audacity in a terminal window.

Online metronomes are plentiful, if you plan on having internet access during your practice.

Other metronome software available in the Ubuntu software repositories includes gtick, klick, gtklick, and kmetronome, though I haven't tried any of them myself.

9

Simple Bash metronome

Usage

metronome.sh [beats per minute] [beats per measure]

Info

  • It plays at 120 bpm in 4 by default
  • More info and a much more sophisticated script is available on my GitHub repo: metronome.sh. The below script is there under metronome-core.sh

For example

metronome.sh
metronome.sh 75     # 75 BPM
metronome.sh 120 3  # 120 BPM, 3 beats per measure

Script

#!/bin/bash
# metronome.sh - Is a metronome.
# Usage: metronome.sh [beats per minute] [beats per measure]

# Set BPM and beats per measure.
bpm="${1-120}"
msr="${2-4}"

# Get seconds per beat using bc.
# "-0.004" accounts for approximate execution time.
beat_time="$(bc -l <<< "scale=5; 60/$bpm-0.004")"

echo "Metronome playing $bpm BPM, $msr beats per measure"
echo -n "Press Ctrl+C to quit."

while true; do
    for ((i=1; i<=$msr; i++)); do
        if [[ $i -eq 1 ]]; then
            # Accentuated beat.
            canberra-gtk-play --id='dialog-information' &
        else
            # Unaccentuated beat
            canberra-gtk-play --id='button-toggle-on' &
        fi
        # Wait before next beat. Will exit if beat time is invalid.
        sleep "$beat_time" || exit
    done
done
wjandrea
  • 14,236
  • 4
  • 48
  • 98
2

I play Guitar and I use gtick. It works pretty well for me. I can adjust the beats per minute, volume and even time signatures, 1/4,2/4,3/4, and so on. You can install it from the command line using:

sudo apt-get install gtick
guntbert
  • 13,134
Abel Tom
  • 641
  • Already mentioned by Nick. Also doesn't work on my system (Ubuntu Unity 16.04). – Jacob Vlijm Aug 24 '16 at 09:30
  • I know its mentioned by Nick, but i have used gtick myself, he has not, as he mentioned. I use Ubuntu 16.04 LTS and it works for me, are you missing some missing audio dependencies or so? – Abel Tom Aug 24 '16 at 09:42
  • See this: https://dl.dropboxusercontent.com/u/1155139/error.png happens no matter the settings etc., on multiple systems. Read something about it, had it running with tricks in the past, don't remember what it was. Don't want to remember. It should simply work. If something like this is not fixed after years, I prefer to write my own stuff. – Jacob Vlijm Aug 24 '16 at 21:55
  • im sorry it did not work for you, heres my gtick: https://i.imgsafe.org/f2dc6c70f2.png – Abel Tom Aug 25 '16 at 17:42
0

You can use GNOME Metronome.

enter image description here GNOME Metronome on Kubuntu 22.04.

It is available on the official repositories.

sudo apt install gnome-metronome

The latest version is available on Flatpak.

flatpak install flathub com.adrienplazas.Metronome
Archisman Panigrahi
  • 28,338
  • 18
  • 105
  • 212
0

Have you tried kmetronome? Should be able to use apt-get/synaptic.

Jodamo117
  • 111