Pygame Musicbox

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Trisman
User
Beiträge: 3
Registriert: Donnerstag 11. August 2016, 11:16

Hallo,

mein Name ist Stephan und ich bin gerade dabei meine Masterarbeit im Fach Kunst abzuschließen. Dabei habe ich eine Installation in der ich drei Interviews über Kopfhörer abspielen lasse. Jedes Interview lässt sich über einen eigenen Button starten. Als Hilfe habe ich folgendes Tutorial benutzt:
https://www.raspberrypi.org/learning/gp ... worksheet/

Soweit habe ich die erste Sounddatei eingefügt und sie spielt auch ab, wenn ich den Button drücke. Das Problem ist nun, wenn ich den Button ein zweites Mal drücke spielt das Programm das Interview in einem zweiten Channel noch einmal ab, so dass zwei Mal das selbe läuft.
Gibt es eine Möglichkeit beim drücken eines Buttons zuerst dafür zu sorgen, dass alle im Moment spielenden Sounddateien gestoppt werden, und dann erst der Sound gestartet wird? Meiner Meinung nach müsste der Code

Code: Alles auswählen

pygame.mixer.stop
dafür zuständig sein, aber ich weiß nicht, wie ich ihn in die Syntax einbauen muss, da ich nur nach Tutorial gearbeitet habe und von Python keine Ahnung habe. Mein bisheriger Code sieht wie folgt aus:

Code: Alles auswählen

from gpiozero import Button
from signal import pause
import pygame.mixer
from pygame.mixer import Sound
pygame.mixer.init()
button = Button(2)


Brunhilde = Sound("Brunhilde.wav")
button.when_pressed =  Brunhilde.play
pause()
Irgendwo nach

Code: Alles auswählen

button.when_pressed =
müsste also der Befehl fürs stoppen kommen und dann erst das

Code: Alles auswählen

Brunhilde.play
.

Kann mir jemand helfen bei dem Problem?

Viele Grüße


Stephan
BlackJack

Eventuell ist `pygame.mixer.music` passender. Ansonsten könnte man, wenn nie irgendein anderer Ton parallel ausgegeben werden soll, auch einfach die Anzahl der Kanäle auf 1 setzen, dann kann auch immer nur ein `Sound` gleichzeitig aktiv sein.
Trisman
User
Beiträge: 3
Registriert: Donnerstag 11. August 2016, 11:16

Hi,
danke für deine Antwort.
Mit dem pygame.mixer.music habe ich jetzt auch schon herum probiert, aber dadurch, dass man dann erst einmal das jeweilige Soundfile laden muss bevor es abspielt wird das ganze noch schwieriger. Die Kanäle habe ich auf 1 gesetzt und nun spielt immer nur noch ein Soundfile gleichzeitig, das ist schon ein Fortschritt.
Meine Idee war dann mit

Code: Alles auswählen

button.when_pressed = pygame.mixer.stop()
den Code zum stoppen aller Soundkanäle zu geben und dann sofort danach mit

Code: Alles auswählen

button.when_released = Brunhilde.play
das Interview anzufangen. Das Starten beim loslassen des Schalters, klappt auch wunderbar, aber scheinbar funktioniert der "stop" Code nicht, es spielt beim Tastendruck immer weiter. Um zu testen, ob der Code überhaupt funktioniert, habe ich mit dem Anfangscode des Tuturials das Interview sofort beim Skriptstart abspielen lassen und dann versucht es mit dem Tastendruck zu stoppen.

Code: Alles auswählen

while True:
    drum.play()
    
button.when_pressed = pygame.mixer.stop()
    
Auch das hat nicht funktierniert, daher vermute ich, dass ich den stop Code irgendwie nicht richtig verwende, finde aber keinen Fehler, und das Skript zeigt mir auch keinen Syntaxfehler an.


Ich habe übrigens gerade bemerkt, dass ich meinen Thread im falschen Unterforum gepostet habe, er passt warscheinlich eher ins Pygame Forum, als hier ins Raspberry (obwohl das ganze ja auf einem Raspberry läuft). Ein Moderator oder Admin darf ihn also gerne verschieben, wenn er hier wirklich falsch ist.


Viele Grüße


Stephan
BlackJack

@Trisman: Zwischen Deiner Zeile zum stoppen und der zum abspielen ist ein wichtiger Unterschied. An diese Attribute musst Du etwas aufrufbares binden und es nicht selber vorher aufrufen und dann den Rückgabewert binden. ``something`` ist was anderes als ``something()``. Und eine ``while True:``-Schleife die nichts im Schleifenkörper enthält was diesen verlassen würde, wird halt nie verlassen und damit Code der danach steht nie ausgeführt. An der Stelle solltest Du vielleicht überlegen Python zu lernen. Denn programmieren durch raten funktioniert nur *sehr* begrenzt.
Trisman
User
Beiträge: 3
Registriert: Donnerstag 11. August 2016, 11:16

Danke für die Erklärung, es waren wirklich die (), die das ganze nicht laufen lassen haben. Mittlerweile läuft alles wie es soll und ich bin zufrieden.
Um dem Thread einen Abschluß zu geben und nicht im Luftleeren Raum stehen zu lassen:

Code: Alles auswählen

from gpiozero import Button
from signal import pause
import pygame.mixer
from pygame.mixer import Sound
pygame.mixer.init()
pygame.mixer.set_num_channels(1)
button1 = Button(2)
button2 = Button(3)
button3 = Button(4)

Brunhilde = Sound("Brunhilde.wav")
Margret = Sound("Margret.wav")
Brigitte = Sound("Brigitte.wav")

button1.when_pressed = pygame.mixer.stop
button2.when_pressed = pygame.mixer.stop
button3.when_pressed = pygame.mixer.stop

button1.when_released = Brunhilde.play
button2.when_released = Margret.play
button3.when_released = Brigitte.play

pause()
Viele Grüße


Stephan
Zuletzt geändert von Anonymous am Freitag 12. August 2016, 16:15, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten