Budowanie metronomu

36

Wprowadzenie

Kilka dni temu potrzebowałem do czegoś metronomu. Nie miałem żadnych dostępnych, więc pobrałem aplikację ze sklepu App Store. Aplikacja miała rozmiar 71 MB !!!
71 MB na zrobienie Tic-Toc ...?!
Przyszedł mi do głowy kod-golf i zastanawiałem się, czy niektórzy z was mogliby to poprawić.

Wyzwanie

Golf trochę kodu, który generuje dźwięk. Nie ma znaczenia, jaki rodzaj dźwięku. W razie potrzeby stwórz plik dźwiękowy ... ale sygnał dźwiękowy systemu również wykona zadanie. ( Oto dźwięk, który stworzyłem ... nic specjalnego. )

Dane wejściowe : liczba uderzeń na minutę wysyłanych przez metronom.

Przykład

To jest wersja Java bez gry w golfa! To tylko pokazać zadanie.

public class Metronome {
  public static void main(String[] args) throws InterruptedException {
    int bpm = Integer.valueOf(args[0]);
    int interval = 60000 / bpm;

    while(true) {
        java.awt.Toolkit.getDefaultToolkit().beep();
        // or start playing the sound
        Thread.sleep(interval);
        System.out.println("Beep!");

    }
  }
}

Zasady

Nie możesz używać zewnętrznych bibliotek, dozwolone są tylko narzędzia samego języka.
Liczą się tylko bajty kodu źródłowego ... nie plik dźwiękowy.

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

EDYTOWAĆ:

Przykładowe dane wyjściowe: Więc coś takiego to dane wyjściowe dla 120 bps : link

GRUSZKA
źródło
1
Czy możesz dodać kilka przykładów we / wy (nagraj dźwięk i prześlij go, opublikuj linki tutaj)?
Addison Crump
2
Pytanie: kiedy mówisz „biblioteki zewnętrzne”, czy obejmuje to biblioteki sugerowane w danym języku? (Nie będę tego używał, ale przykład znajduje się w Vitsy, w którym mogę uzyskać dostęp do powłoki lub JS (ale JS jest wbudowany))
Addison Crump
3
Czy możesz dodać fragment tabeli wyników ?
Addison Crump
1
Podejrzewam, że większość pobranej aplikacji to ładna grafika i efekty dźwiękowe. To tak, jak te aplikacje latarki, które robią nic, tylko zmieniają ekran na biały, ale wciąż potrafią zużyć dziesiątki MB ...
Darrel Hoffman
1
Jakie są wymagania dotyczące dokładności? W twoim przykładzie beep()dane wyjściowe zarówno konsoli , jak i konsoli nie są dokładnie natychmiastowe IIRC. Żadna z nich nie sleep()jest znana z dokładności.
Num Lock

Odpowiedzi:

19

Mathematica, 26 bajtów

Pause[Beep[];60/#]~Do~∞&

Dojest zwykle używany jako pętla „for” w najwęższym znaczeniu: powtórz ten fragment kodu dla każdego iod xdo y… lub nawet po prostu powtórz ten fragment kodu nrazy. Zamiast liczby nmożemy nadać jej nieskończoność, aby utworzyć nieskończoną pętlę. Ciało pętli Pause[Beep[];60/#]to po prostu golfowy sposób pisania, Beep[];Pause[60/#]gdzie #jest argument funkcji.

Jeśli rozwiązanie może ostatecznie wysadzić stos wywołań, możemy zapisać jeden bajt za pomocą rozwiązania rekurencyjnego:

#0[Beep[];Pause[60/#];#]&
Martin Ender
źródło
Nie wiedziałem, że ~Do~∞to możliwe. ForPętla tylko mnie do 29 bajtów. (Osobiście uważam, że 26-bajtowa wersja jest jedyną prawidłową wersją.)
LegionMammal978
@ LegionMammal978 Niestety ~Do~∞nie wydaje się działać, gdy pochodzi ze zmiennej. (Próbowałem tego użyć podczas gry w golfa na swojej maszynie prawdy.)
Martin Ender
1
Attributes[Do]obejmuje HoldAll, więc domyślam się, że _~Do~∞ma specjalny wzorzec oceny.
LegionMammal978
@ LegionMammal978 Wygląda to bardziej jak zmienne, ponieważ komunikat o błędzie, w Do[...,a]którym wartość hold anieskończoności pokazuje połączenie jako Do[...,{a}].
Martin Ender
14

Pyth, 11 10 9 bajtów

Dzięki Adnanowi za przypomnienie #.

#C7.dc60Q

Forever ( #), wydrukuj Ckod har 7. Następnie uśpienie ( .d) 60sekund podzielone przez ( c) input ( Q).

PurkkaKoodari
źródło
@Adnan Zapomniałem o tym. Dzięki.
PurkkaKoodari
Potrzebujesz przestrzeni?
lirtosiast
@ThomasKwa Tak. IIRC 7.zostanie przeanalizowany jako liczba.
Conor O'Brien
5
O. #pythnoob
Conor O'Brien
2
Nie mogłem spać .d, kiedy próbowałem.
Nadal drukował
8

JavaScript, 36 45 42 41 34 bajtów

Zapisano 1 bajt dzięki @RikerW

Zaoszczędzono 1 bajt dzięki produktom @ETH

n=>{for(;;sleep(60/n))print("\7")}

To jest funkcja.

Jeśli `\7`użyję, SpiderMonkey skarży się, że ósemkowe literały są przestarzałe.

Alternatywnie, 31 bajtów

n=>{for(;;sleep(60/n))print``}

Problem polega na tym, że nie można drukować, ale to powinno działać.

Downgoat
źródło
Cholera, właśnie miałem coś takiego opublikować. Nadal zamierzam to opublikować (ponieważ używa węzła i wszystkich), ponieważ używam innego podejścia.
Addison Crump
Jeśli spojrzysz na to ze sposobu, w jaki zadałem pytanie, rozwiązanie rekurencyjne nie byłoby możliwe. Metronomy są stworzone do pracy i pracy ... nie po awarii po pewnym czasie.
PEAR
@PEAR nie powinno się zawiesić, ponieważ żadna zmienna nie jest przyrostem. Jedyne, co może spowodować awarię, to bufor terminala, z wyjątkiem nowoczesnych komputerów, które
Downgoat
W jakim środowisku to działa? Próbowałem Chrome i Node.js, ale nie mogę go uruchomić.
starbeamrainbowlabs 13.04.16
@starbeamrainbowlabs używa powłoki JavaScript (SpiderMonkey)
Downgoat
8

Bash, 53 55 41 bajtów

Podziękowania dla @Dennis za stratę 14 bajtów 1

Okej, czas prawdy: jestem okropny w golfowym bashu. Każda pomoc byłaby bardzo mile widziana.

echo " ";sleep `bc -l<<<60/$1`;exec $0 $1
      ^ That's ASCII char 7

1 cholera. Nic dziwnego, że nikt nie może prześcignąć Dennisa.

Addison Crump
źródło
Jest while 1możliwe
PEAR
@PEAR Nupe - już tego próbowałem.
Addison Crump
while printf \\abyć może?
Neil
To nie działa, ponieważ bash używa podziału na liczby całkowite. Musisz użyć bc.
spaghetto
1. Znak BEL nie jest wyjątkowy dla Bash, więc nie potrzebujesz cytatów. 2. Jeśli odczytujesz dane wejściowe jako CLA, nie potrzebujesz read. 3. echoistnieje z kodem 0, więc możesz użyć tej instrukcji zamiast true.
Dennis
7

JavaScript ES6 (przeglądarka), 43 bajty

Może to rozciągać zasady:

x=>setInterval('new Audio(1).play()',6e4/x)

Nadaj tej funkcji nazwę (np. F=x=>...) I wprowadź ją w konsoli przeglądarki na tej stronie . Następnie wywołaj funkcję za pomocą bps, np. F(60)I poczekaj, aż magia się wydarzy. :-)

Dlaczego to działa? Cóż, b.htmlznajduje się w tym samym folderze co plik o nazwie 1, który jest przykładowym plikiem dźwiękowym z OP. Nie jestem pewien, czy jest to zgodne z regułami (wydaje mi się, że jest to wersja powłoki; musi działać w określonym środowisku), ale warto było spróbować.

Bezpieczniejsza wersja, 57 bajtów

Jeśli z jakiegoś powodu powyższy kod nie jest dozwolony, spróbuj tego:

x=>setInterval('new Audio("//ow.ly/Xrnl1").play()',6e4/x)

Działa na każdej stronie!

ETHprodukcje
źródło
To ciekawe rozwiązanie. Jest jeszcze krótszy, gdy pobierasz i zmieniasz nazwę pliku, prawda?
PEAR
@PEAR Byłoby to krótsze, ale do uruchomienia musiałby mieć własną stronę internetową z plikiem dźwiękowym w tym samym folderze.
ETHproductions
Och, to JavaScript xD ... masz rację
PEAR
@PEAR Tam, zrobiłem to. Czy to nowe rozwiązanie jest zgodne z zasadami?
ETHproductions
Huh Możesz określić, że jest to JS na określonej stronie internetowej. Jest to istniejący tłumacz, więc jest to prawidłowy język.
Addison Crump
6

05AB1E , 31 bajtów

Kod:

I60s/[7ç?D.etime.sleep(#.pop())

Gdybym miał wbudowane oczekiwanie N sekund, mogłoby to być 11 bajtów. Niestety tak nie jest. Oto wyjaśnienie:

I                               # Push input
 60                             # Push 60
   s                            # Swap the top 2 items
    /                           # Divide the top 2 items
     [                          # Infinite loop
      7ç                        # Push the character \x07
        ?                       # Output it, which give a sound
         .e                     # Evaluate the following as Python code
           time.sleep(       )  # Wait for N seconds
                      #         # Short for stack
                       .pop()   # Pop the last item

Wykorzystuje kodowanie ISO 8859-1.

Adnan
źródło
To musi być jedna z pierwszych odpowiedzi 05AB1E o.Ô Dziwnie jest widzieć time.sleepi .pop()wewnątrz kodu w ten sposób. ;)
Kevin Cruijssen
6

osascript, 39 bajtów

on run a
repeat
beep
delay 60/a
end
end

Istnieje dosłownie polecenie o nazwie beep? Sweeeet!

Można uruchomić tylko w systemie Mac OS X z powodu ograniczonej licencji, ale aby uruchomić:

osascript -e "on run a
repeat
beep
delay 60/a
end
end" bpm
Addison Crump
źródło
6

Pyton, 68 67 57 bajtów

Zapisano 1 bajt dzięki @FlagAsSpam

Zaoszczędź 9 bajtów dzięki @Adnan

import time
a=input()
while 1:print"\7";time.sleep(60./a)

Zajęło to również 2 bajty mniej po konwersji zakończeń linii do formatu UNIX.

Starsza wersja, która faktycznie przyjmuje bpm jako argument wiersza poleceń (66 bajtów):

import sys,time
while 1:print"\7";time.sleep(60./int(sys.argv[1]))
wojownik internetowy
źródło
4
Nie można zrobić print"\7";? Nie jestem pewien, ale jestem pewien, że to działa.
Addison Crump
@Andan Nie, input () żąda wprowadzenia danych od użytkownika. Nie wiem, czy jest to uważane za prawidłowe dane wejściowe. W każdym razie konieczna jest także konwersja na liczbę.
webwarrior
1
Co powiesz na a=input()i azastąpienie int(sys.argv[1])? Zawsze myślałem, że Python 2 automatycznie ocenia dane wejściowe i dlatego nie potrzebuje konwersji int, ale mogę się mylić.
Adnan
@Andan input()faktycznie dokonuje automatycznej oceny. Zapomniałem o tej funkcji. Jest to raczej mało mityczne - prawdopodobnie dziedzictwo z dawnych czasów.
webwarrior
Można time.sleep(60./a)go zastąpić time.sleep(60./input()), całkowicie usuwając a=input()?
klaskać
4

AutoIt , 56 bajtów

Func _($0)
While Sleep(6e4/$0)
Beep(900,99)
WEnd
EndFunc
mınxomaτ
źródło
4

Vitsy, 14 bajtów

a6*r/V1m
<wVO7

Tryb gadatliwy (tłumacz wkrótce):

0:                              // a6*r/V1m
push a; // 10
push 6;
multiply top two; // 60
reverse stack; // bpm on top
divide top two; // bpm/60
save/push permanent variable; 
push 1;
goto top method; // goes to 1
1:                              // <wVO7
go backward; // infinite loop, from the bottom of 1
wait top seconds;
save/push permanent variable; // pushes the bpm in terms of seconds of delay
output top as character;
push 7;

Zasadniczo używam woperatora, aby czekać określoną liczbę sekund określoną przez bpm/60nieskończoną pętlę. Następnie robię szum przy użyciu wyjścia terminala o znaku 7 ASCII ( BEL).

Addison Crump
źródło
Wygląda ładnie, ale jak mogę to przetestować? :)
PEAR
@PEAR Musisz pobrać tłumacza (zapomniałeś połączyć go w tytule). Zapisz go w pliku i uruchom za pomocą java -jar Vitsy.jar <filename>.
Addison Crump
4

C #, 118 bajtów

class A{static int Main(string[]a){for(;;System.Threading.Thread.Sleep(60000/int.Parse(a[0])))System.Console.Beep();}}

Podstawowe rozwiązanie.

LegionMammal978
źródło
Dlaczego nie wydrukować ASCII char 7?
Addison Crump
@FlagAsSpam Jest dłużej: dźwięk systemu używa System.Console.Beep();, a drukowanie znaków używa System.Console.Write('<\a character>');.
LegionMammal978
Łał To dużo, aby napisać postać.
Addison Crump
4

Java, 103 82 bajty

Dzięki @Justin za golenie 21 bajtów!

Och Jezu.

void x(int b)throws Exception{for(;;Thread.sleep(60000/b))System.out.print('\7');}

Metoda i wersja golfowa przykładowego programu.

Addison Crump
źródło
Dlaczego nie System.out.print('\7');zamiast java.awt.Toolkit.getDefaultToolkit().beep();?
Justin
@Justin \ służy wyłącznie do ucieczki znaków regularnych.
Addison Crump
1
nie, odwrotny ukośnik jest sekwencją ucieczki. '\7'jest postacią dzwonka, która wydaje dźwięk, gdy jest drukowana
Justin
@Justin Huh. Zawsze rzucałem na to błędy (przy użyciu podwójnych cudzysłowów). Mój błąd. Dzięki! : D
Addison Crump
3

GMC-4Kod maszynowy , 21,5 bajtów

GMC-4 to 4-bitowy komputer firmy Gakken do nauczania zasad asemblera w uproszczonym zestawie instrukcji i komputerze. Ta procedura pobiera dane z adresów pamięci danych0x5D poprzez0x5F , w big-endian przecinku (czyli jedna cyfra za dziobanie).

Algorytm w zasadzie dodaje dane wejściowe do pamięci i czeka 0,1 s, aż będzie co najmniej 600, a następnie odejmuje 600 i wydaje sygnał dźwiękowy w nieskończonej pętli. Ponieważ GMC-4 ma kilka funkcji zamiany rejestrów, ale nie ma kopii rejestru funkcji , robi się to na poważnie.

Szesnastkowo (druga linia to pozycja w pamięci):

A24A14A04 80EC AF5A2EF AE5A1EF AD5A0EF 8A6 F2AF09 86ADEEE9F09
012345678 9ABC DEF0123 4567890 ABCDEF0 123 456789 ABCDEF01234

W montażu:

    tiy 2     ;ld y, 0x2
    AM        ;ld a, [0x50 + y]
    tiy 1
    AM
    tiy 0
    AM
start:
    tia 0     ;ld a, 0x0
    cal timr  ;pause for (a+1)*0.1 seconds
    tiy F
    MA        ;ld [0x50 + y], a
    tiy 2
    cal DEM+  ;add a to [0x50 + y]; convert to decimal and carry.
    tiy E     ;do the same for the second digit
    MA
    tiy 1
    cal DEM+
    tiy D     ;and the third.
    MA
    tiy 0
    cal DEM+
    tia A
    M+
    jump beep
    jump start
beep:
    tia 6
    tiy D
    cal DEM-
    cal SHTS  ;'play short sound'
    jump start

Zrzeczenie się:

W rzeczywistości nie posiadam GMC-4. Skrupulatnie sprawdziłem ten program z dokumentacją online, ale mogłem się pomylić. Nie znam też endianizmu. Wygląda na to, że GMC-4 jest big-endianem, ale nie jestem pewien. Jeśli ktoś jest właścicielem GMC-4 i może to zweryfikować / powiedzieć mi o endianistyczności GMC-4, bardzo bym to docenił.

lirtosiast
źródło
3

C, 48 bajtów

void f(int b){while(printf(""))Sleep(60000/b);}
                            ^ literal 0x07 here

Rozwiązanie tylko dla systemu Windows (funkcja Sleep (), a konkretnie).

Użyłem również (ab) faktu, że printf () zwraca liczbę wydrukowanych znaków, aby użyć go jako warunku nieskończonej pętli.

Pomiędzy podwójnymi cudzysłowami w wywołaniu printf () występuje znak, ale z jakiegoś powodu nie jest tu wyświetlany. W razie wątpliwości skopiuj i wklej do Sublime Text 2 lub Notepad ++, znak będzie wyświetlany jakoBEL .

To zaczęło się jako rozwiązanie C ++, ale w pewnym sensie wpadło w podzbiór C C ++ (ponieważ, wiesz, Sleep()jest nieco krótszy niż std::this_thread::sleep_for(std::chrono::milliseconds())) i printf()jest krótszy niż std::cout<<).

Alexander Revo
źródło
3

AppleScript 94 bajty

Wiem, że jestem spóźniony i to jest mój pierwszy post tutaj, ale cokolwiek.

wyświetl okno dialogowe „„ domyślna odpowiedź ””
ustaw x na 60000 / zwracany tekst wyniku
powtarzać
brzęczyk
opóźnienie x
koniec

Nie golfowany:

wyświetl okno dialogowe „„ domyślna odpowiedź ””
ustaw x na 60000 / (zwracany tekst wyniku)
powtarzać
    brzęczyk
    opóźnienie x
koniec powtórz
ty
źródło
Hej, nowe odpowiedzi :) Niestety nie mogę wypróbować twojego posta, chyba że nie mam Maca;) - ale wielkie dzięki
PEAR
@PEAR Nie ma za co. :)
You
Witamy w Programowaniu zagadek i Code Golf. To dobra odpowiedź, +1. Proszę, odpowiedz dalej!
wizzwizz4
2

VBScript, 113 66 bajtów

a=InputBox("")
Do
WScript.Echo(Chr(7))
WScript.Sleep(60000/a)
Loop

Ten program jest dość prosty; pobiera dane wejściowe, powtarza znak BEL i czeka. Dzięki Niel za wygaszenie prawie połowy programu!

Conor O'Brien
źródło
Co jest nie tak z WScript.Echo CHR(7)? Czy miałeś na myśli 60000?
Neil
@Neil Ah, tak. zapomniałem o nich;
Conor O'Brien
2

Rubin, 37 33 bajtów

m=->b{loop{puts"\7"
sleep 6e1/b}}

Całkiem proste.

To jest funkcja lambda. Jeśli chciał 60 bpm, to zrobić: m[60].

Justin
źródło
Teoretycznie $><<?\apowinien również działać na sygnał dźwiękowy. I nie ma potrzeby, aby podać nazwę proc (wszystkie rozwiązania z funkcją JavaScript strzałki tłuszczu również pozostawić nieprzypisane), można nazwać to anonimowo za: ->b{loop{$><<?\a;sleep 6e1/b}}[60].
manatwork
@manatwork Mam tylko Ruby 2.x, więc nie mogłem przetestować ?\a; czy masz Ruby 1.x? Jeśli tak, czy możesz przetestować, czy to działa?
Justin
Cóż, mam Ruby 1.9.3 i kod nie zgłasza z nim błędu. Ale mam inny problem z testowaniem: brak sygnału na mojej maszynie. Ani Ruby, ani nic innego. Ustaw coś raz, nie wiem co.
manatwork
2

Japt, 30 bajtów

6e4/U i`?w Au¹o('../1').play()

?Powinny być dosłowne bajt 9A. Przetestuj online! (Przepraszamy za wyskakujące okienko opóźniające kilka pierwszych uderzeń; zostanie ono wkrótce usunięte).

Jak to działa

6e4/U i"new Audio('../1').play()  // Implicit: U = input bps
6e4/U                             // Calculate 60000 / U.
      i                           // Set a timed event every that many milliseconds,
       "new Audio('../1').play()  // running this code every time.
                                  // ../1 is the path to the file used in my JS entry.
ETHprodukcje
źródło
2

Świnka, 18 bajtów

R I F  H 60/I W *7

Wczytaj BPM do zmiennej I, a następnie F {z dwiema spacjami po} jest nieskończoną pętlą. Zatrzymaj się na 60 sekund / BPM, a następnie zapisz $ CHR (7) {Ascii: BEL} na standardowe wyjście, podając wymagane wyjście audio, a następnie uruchom ponownie w nieskończonej pętli.

zmerch
źródło
2

Java, 321 znaków

Brzmi bardzo dobrze. Działa tylko w systemach z obsługą MIDI.

import javax.sound.midi.*;import java.util.*;class A{public static void main(String[] a) throws Exception{int d=new Scanner(System.in).nextInt();Synthesizer b=MidiSystem.getSynthesizer();b.open();MidiChannel c=b.getChannels()[0];c.programChange(116);while(true){c.noteOn(0,100);Thread.sleep((int)(d/.06));c.noteOff(0);}}}

.

nazwa_użytkownika.ak
źródło
Wygląda ładnie, ale to nie działa dla mnie: pastebin.com/0CbGYkU0
PEAR
Naprawiono @PEAR. Zapomniałem obsady.
username.ak
@PEAR i import
username.ak
@PEAR, zamieniłem kilka operacji z powodu braku dźwięku
username.ak
2

ChucK , 90 bajtów

Biały szum, który jest włączany i wyłączany co dwa tyknięcia.

60./Std.atoi(me.arg(0))*1000=>float s;while(1){Noise b=>dac;s::ms=>now;b=<dac;s::ms=>now;}

Wyjaśnienie

60./Std.atoi(me.arg(0)) //Convert the input to an int and divide 60 by it
*1000                   //Multiply by 1000 (in order to avoid s::second)
=>float s;              //Store it as a float in variable s
while(1)                //Forever,
{Noise b=>dac;          //Connect a noise generator b to the audio output
s::ms=>now;             //Wait for s milliseconds
b=<dac;                 //Disconnect b from the audio output
s::ms=>now;}            //Wait for s milliseconds

Ma to na celu włączenie dźwięku w takcie, a następnie wyłączenie go w późniejszym czasie.

98 93 bajtowa wersja (hodowca)

Biały szum odtwarzany przez 10 milisekund na tik.

60./Std.atoi(me.arg(0))*1000-9=>float s;while(1){Noise b=>dac;10::ms=>now;b=<dac;s::ms=>now;}

Jest to kliknięcie zamiast ciągłego włączania i wyłączania hałasu.

The_Basset_Hound
źródło
2

Perl 5, 36 bajtów

{{$|=print"\a";sleep 60/$_[0];redo}}

Podprogram; użyj go jako

sub{{$|=print"\a";sleep 60/$_[0];redo}}->(21)
msh210
źródło
sleepjest w sekundach, więc nie możesz mieć więcej niż 60 sygnałów na minutę, nie jestem pewien, czy to wymóg. Ponadto prawdopodobnie możesz zachować tę samą liczbę bajtów, ale mieć pełny program, wykonując coś takiego: $|=<>;{print"\a";sleep 60/$|;redo}(nie można go teraz przetestować).
ChatterOne
@ChatterOne, zgodnie z jego dokumentacją, masz rację sleep. Ale to zadziałało dla mnie.
msh210
1

Jolf, 7 bajtów, niekonkurujący

Dodałem dźwięki po tym bardzo dobrym wyzwaniu.

TΑa/Αaj
T       set an interval
 Αa      that plays a short beep (Α is Alpha)
   /Αaj  every 60000 / j (the input) seconds. (Αa returns 60000)

Jeśli chcesz wyczyścić ten dźwięk, zwróć uwagę na wynik. Powiedz, że ta liczba to x. Wykonaj kolejne polecenie Jolf ~CP"x", a interwał zostanie wyczyszczony.

Conor O'Brien
źródło
1

Zsh, 32 bytes

<<<$'\a'
sleep $[60./$1]
. $0 $1

Based on the leading bash answer, but sources instead of execs. The TIO link sources $0:a because of how the original file is executed, but it will work without it.

Try it online!

GammaFunction
źródło
You're late to the party but this looks like really fine solution!
PEAR
I know I'm late, but I just felt like golfing today. Decided to check on the music tag for fun, and found this challenge. Good one, btw!
GammaFunction
0

Bash + bc + ><>, 44 bytes

Playing on the fact that the ><> interpreter lets you define a tick time :

python fish.py -t $(bc -l<<<"2/$1/60") -c 7o

The ><> code is 7o and should output the BEL character, producing a system beep. It will loop until interrupted.
The -t value is set to (2 / RPM ) / 60 so that the whole code is played RPM * 60 times per second.

Aaron
źródło
Thanks a lot for a new answer after some amount of time after publishing. Doesn't work for me :( Not sure if a problem of my system or something else. I downloaded the fish.py from GitHub and executed your commad (openSUSE). Got this error: (standard_in) 1: syntax error usage: fish.py [-h] (<script file> | -c <code>) [<options>] fish.py: error: argument -t/--tick: expected one argument
PEAR
Have you got bc installed? It looks like the $(bc -l<<<"2/$1/60") did not produce any output. I'll add it to the list of languages of the answer. I haven't been able to fully test my answer yet, so there might be some kind of error too.
Aaron
0

SmileBASIC, 26 bytes

INPUT B$BGMPLAY@8T+B$+"[C]

It can play any general midi instrument, though anything above 9 will use more bytes.

12Me21
źródło
0

Stax, 17 bytes

ü7»♥O╚⌂╥☻≈OyM╜Δ∩`

or, unpacked:

4|A48*x/W2|A]pc{| }*

The program outputs bytes that, when fed through the command line tool aplay with default setting, produce a metronome noise. The input is used as bpm

example:

example-stax-interpreter metronome.stax -i "60" | aplay

You should hear a horrible beeping noise at the desired bpm

user89655
źródło