Eine Schleife die alle x Durchläufe beeb macht oder eine mp3 oder wave wieder gibt

Du hast eine Idee für ein Projekt?
Antworten
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Hallo,

ich möchte eine Schleife basteln die:
* alle y Durchläufe, beeb macht
* oder wenn so etwas gehen sollte, eine kurze mp3 oder wave Datei wieder gibt.

Bisher habe ich folgendes zusammen geschnorrt:

Code: Alles auswählen

#!/usr/bin/env python3

##### Variablen #####
zu_machende_schleifendurchllaufe = 1000000
alle_y_durchlaufe_durchlaufe_beeb_machen = 10

# Start von Schleife, mit einstellbarer Durchlaufanzahl
x = 1
while x <= zu_machende_schleifendurchllaufe:
	print(x)
	x = x + 1
    
    	# Zahl der erfolgten Schleifendurchlaufe zählen   
	erfolgte_schleifendurchlaufe = erfolgte_schleifendurchlaufe + 1
	### Teil der Hilfe bedarf #
	#nun alle  alle_y_durchlaufe_durchlaufe_beeb_machen

	import os
	print ("Beeb aus geben")
	duration = 1 # seconds
	freq = 440 # Hz
	os.system('play -nq -t alsa synth {} sine {}'.format(duration, freq))
	print ("")
	print ("")

	import time
	# warte 5s
	time.sleep(5)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht immer dieses while-Schleifen-Gefummel. for-Loops sind fuer zaehlen gemacht. Und du brauchst auch nur einen Zaehler. Importe gehoeren immer an den Anfang der Datei.

Ein Weg, Sounds abzuspielen, ist pygame.

Und die Frage danach, ob etwas zum n-ten mal passiert ist, kannst du mit dem modulo-Operator beantworten:

Code: Alles auswählen

n = 13
for zaehler in range(1000):
    if zaehler % n == 0:
        print("piep", zaehler)
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Besten Dank. Den Code werde ich dann erst einmal ein setzen.
__deets__ hat geschrieben: Freitag 17. April 2020, 16:24 Bitte nicht immer dieses while-Schleifen-Gefummel. for-Loops sind fuer zaehlen gemacht. Und du brauchst auch nur einen Zaehler. Importe gehoeren immer an den Anfang der Datei.
Bisher bevorzuge ich das "while-Schleifen-Gefummel", weil ich da zumindest schon mal bei Fremdcode verstehe was da vor sich geht. Vlt. wird es ja im Laufe der Zeit besser.

Könnte man es denn als "while-Schleifen-Gefummel" dar stellen ?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Susann.M.23: Lerne ``for``-Schleifen. Das sind in aller Regel die ”normalen” Schleifen. Die braucht man öfter als ``while``-Schleifen. ``while``-Schleifen sind der Sonderfall den man manchmal braucht wenn es mit ``for`` nicht geht. ``while``-Schleifen die etwas ausdrücken was sonst eine ``for``-Schleife macht, sind komplizierter, brauchen in der Regel vor der Schleife schon Code um etwas zu initialisieren, und irgendwo in der Schleife, meistens gegen Ende noch mal Code um etwas zu aktualisieren. Das mehr Code, das ist weiter verteilter Code, und das ist fehleranfälliger als das alles in der ``for … in …:``-Zeile abzufrühstücken.

Ein Kommentar wie „# Variablen“ ist sinnfrei. Das sieht man doch, dass da im Code Variablen definiert werden. Kommentare sollten nicht beschreiben *was* der Code macht, denn das steht da ja bereits als Code sondern *warum* er dass so macht. Also dem Leser einen Mehrwert über den Code liefern. Ein ``# warte 5s`` vor einem ``time.sleep(5)`` liefert keinen Mehrwert aber mehr Arbeit wenn man die Zeit mal ändern will/muss, weil man dann auch immer den Kommentar identisch mit ändern muss.

Um externe Programme auszuführen gibt es das `subprocess`-Modul. `os.system()` sollte dafür nicht verwendet werden. Die Dokumentation dieser Funktion weist auch auf das `subprocess`-Modul hin.

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
import time


def main():
    iteration_count = 1_000_000
    beep_interval = 10  # in iteration counts.
    beep_duration = 1  # in seconds.
    beep_frequency = 440  # in Hz.

    for x in range(1, iteration_count + 1):
        print(x)

        if x % beep_interval == 0:
            print("Beeb aus geben")
            subprocess.run(
                [
                    "play",
                    "--null",
                    "--no-show-progress",
                    "--type",
                    "alsa",
                    "synth",
                    str(beep_duration),
                    "sine",
                    str(beep_frequency),
                ],
                check=True,
            )
            print()
            print()

        time.sleep(5)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Und dann gibt es noch das Alarm-Zeichen \a, das auf der Konsole ein Beep erzeugt:

Code: Alles auswählen

print("Beep ausgeben\a")
Antworten