tkinter+winsound=synthesizer?

Fragen zu Tkinter.
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

hi
ich bin neu hier und hab mich gefragt ob es vieleicht möglich wäre mit tkinter und winsound einen synthesizer zu schreiben

ich stelle mir das so vor:
-maussteuerung
-ein fenster
-x-position der maus im fenster=tonhöhe
-y-position der maus im fenster=tonlänge
-ton wird nur ausgegeben wen man die maustaste drückt und gedrückt hält

ich hoffe das ist nicht zu kompliziert und mir kann jemand helfen
danke im vorraus :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hallo, willkommen im Forum!

Ja, ich denke mittels Beep() sollte das funktionieren. Testen kann ich es mangels Windows-System allerdings nicht.

Und: Für Tonhöhe und -länge würde ich x und y vertauschen.
Evtl. wird der Aspekt "gedrückt hält" problematisch.
Warum nicht einfach nur einmal kurz klicken, um den Ton anzustoßen?
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

ich würde es eher nach dem schema:

Code: Alles auswählen

while maustaste_ist_gedrückt=1 AND maus_ist_in_fenster=1 do:
     Beep(ypos,xpos)
machen
P.S:ich hab noch nicht wirklich mit tkinter gearbeitet also brauche ich evtl. etwas hilfe bei mausposition erfassen und in variablen übergeben
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Und viel mit Python auch nicht ... :wink:
- while .. do gibt es in Python nicht
- = ist ein Zuweisungsoperator, kein Vergleichsoperator

Wenn du den Ton so lange hören willst, wie die Maus gedrückt ist, wofür brauchst du dann eine eingestellte Tonlänge?

Genau da sehe ich das Problem: Du musst beim Aufruf von Beep() eine Tonlänge übergeben und kannst den Ton nicht einfach so lange halten, bis ein bestimmtes Ereignis eingetreten ist. Was man probieren könnte wäre, Beep() immer wieder mit ganz kurzen Zeitintervallen aufzurufen.

Wenn ich mich an alte Pascal-Zeiten zurückerinnere (da gibt es eine sound()-Funktion in der Unit crt mit ähnlicher Funktionalität), dann führte das da aber im wesentlichen zu einer Abfolge von Knacklauten ...
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

wofür könnte ich die xpos dann verwende?
irgendwie für effekte(modulation, schwebung)?

mein egentliches problem ist eigentlich die mausposition in einem vorgegebenen fenster abzufragen und in eine variable zu schreiben
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Earthnuker hat geschrieben:wofür könnte ich die xpos dann verwende?
irgendwie für effekte(modulation, schwebung)?
So wie ich das sehe, gibt das winsound-Modul soviel gar nicht her. Mit Beep() wird das allenfalls ein bisschen Spielerei. Ein "Synthesizer" - wie in deinem ersten Post zu lesen - wird das damit sicher nicht.
Earthnuker hat geschrieben:mein egentliches problem ist eigentlich die mausposition in einem vorgegebenen fenster abzufragen und in eine variable zu schreiben
Wenn das dein eigentliches Problem ist - was an sich keins ist -, dann zeig doch mal den restlichen Code.

Als Lektüre für das Event-Handling empfehle ich
http://infohost.nmt.edu/tcc/help/pubs/t ... vents.html
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

ich hab noch keinen code, darum brauche ich ja hilfe(bin noch n python noob) und mit tkinter hab ich noch nix gemacht
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Na, dann lies dich doch erstmal ein ...

Einstieg in Python:
http://docs.python.org/tut/tut.html

Einstieg in Tkinter:
http://www.ferg.org/thinking_in_tkinter ... grams.html
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

mein eigentliches problem ist es
1.Das Fenster zu machen und
2.die Mausposition im Fenster zu erkennen und in eine Variable zu übertragen

P.S:ja, ich weiss da ich mich wiederhohle
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Earthnuker hat geschrieben:mein eigentliches problem ist es
1.Das Fenster zu machen und
2.die Mausposition im Fenster zu erkennen und in eine Variable zu übertragen
Hast du denn schon gelesen (s.o.)? - Vermutlich nicht. Sonst wäre zumindest Problem 1 schnell erledigt.

Ich glaube nicht, dass dir irgendjemand den fertigen Code hier präsentieren wird. Lies dich doch mal ein, zeig uns deinen Code und dann sehen wir mal ...
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

eventuell könnte mir ja jemand mal n anhaltspunkt geben, da ich nicht weiss wie ich anfangen soll -.-
und des mit dem n fenster machen un mmausposition erfassen, da peil ich nich wie ich des hinkrieg
:K
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Lies doch die Tkinter-Dokumentation oder nutze die Suchfunktion.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

Hier mein Script,

Code: Alles auswählen

from Tkinter import *
from winsound import *

master = Tk()

w = Canvas(master, width=500, height=500)
w.pack()

mainloop()
:roll:
Jetz muss ich nurnoch irgendwie die Mausposition erfassen
und ob die maus innerhalb des fensters ist
damit wäre problem 1 gelöst
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Import per * ist meistens nicht gut. Hier zum Beispiel.
Dadurch verlierst du den Überblick im Namensraum, überschreibst ggf. unabsichtlich bestimmte Funktionen o.ä.

Besser:

Code: Alles auswählen

import Tkinter as tk
import winsound
"w" ist sicher kein guter Bezeichner für ein Canvas-Widget: Es enthält keinerlei Informationen darüber, was sich dahinter verbirgt.

Und zur Erfassung der Mausposition habe ich dir weiter oben schon einen Link zum Lesen angeben. Es geht ja hier um "Events" und wie die in Tkinter behandelt werden, musst du erstmal verstehen.
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

Code: Alles auswählen

from Tkinter import *
import winsound
master = Tk()
Synth = Canvas(master, width=500, height=500)
Synth.pack()
mainloop()
Besser?

p.S: in dem tkinte tutorial steht nich wie man die mausposition erfasst
gibt's da irgendwie vordefinierte variablen?
PP.S:notfalls kann die tonhöhe und tonlänge auch über zwei schieberegler geändert werden(falls da einfacher ist)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Earthnuker hat geschrieben:Besser?

p.S: in dem tkinte tutorial steht nich wie man die mausposition erfasst
gibt's da irgendwie vordefinierte variablen?
Nicht viel besser.
- Immer noch mit Sternchen importiert.
- In Python werden nur Klassenbezeichner per Konvention groß geschrieben
- synth ist besser als w, aber geht noch besser

Sicher steht's im Tutorial. Die Einstiegsseite zur Ereignisbehandlung ist doch oben verlinkt. Da musst du dann mal ein paar Seiten weiter blättern und lesen, lesen, lesen ...
BlackJack

Naja, nicht nur lesen, *verstehen* ist auch nicht ganz unwichtig. ;-)
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

hab mich jetzt entschieden das ganze mit Pygame zu machen:

Code: Alles auswählen

import pygame
from winsound import *
from pygame.locals import *

def main():
   pygame.init()
   pygame.display.set_mode((800,600))
   pygame.display.set_caption('Testing')
   running = True
   while running:
      for event in pygame.event.get():
         if event.type == QUIT:
            running = False
         if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
         if 1:
           x, y=pygame.mouse.get_pos()
           if y>37:
               Beep(y,x)
   pygame.display.quit()

if __name__ == '__main__':
   main()
so, fertig :) hab das ganze einfach auf nem fertigem scripr aufgebaut
mein einziges problem ist jetz das mit dem geklickt halten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Earthnuker hat geschrieben:so, fertig :) hab das ganze einfach auf nem fertigem scripr aufgebaut
Na dann.
Earthnuker
User
Beiträge: 12
Registriert: Dienstag 19. August 2008, 17:09
Kontaktdaten:

übrigens danke für die hilfe :D
p.s:des mit dem das der ton nur ausgegeben wird wenn die maustaste gedrückt gehalten wird krieg ich irgendwie nicht hin

Code: Alles auswählen

import pygame
from winsound import *
from pygame.locals import *
xwin=raw_input("x size of the window: ")
ywin=raw_input("y size of the window: ")
def main():
   pygame.init()
   pygame.display.set_mode((int(xwin),int(ywin)))
   pygame.display.set_caption('Testing')
   running = True
   while running:
      for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
        if event.type == MOUSEBUTTONDOWN:
           x, y=pygame.mouse.get_pos()
           if y>37:
               Beep(y,x)
   pygame.display.quit()

if __name__ == '__main__':
   main()
zeile 17 ist das problem
mit while gehts nicht
Antworten