Seite 1 von 2

tkinter+winsound=synthesizer?

Verfasst: Dienstag 19. August 2008, 18:38
von Earthnuker
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 :)

Verfasst: Dienstag 19. August 2008, 19:32
von numerix
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?

Verfasst: Dienstag 19. August 2008, 20:01
von Earthnuker
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

Verfasst: Dienstag 19. August 2008, 20:08
von numerix
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 ...

Verfasst: Dienstag 19. August 2008, 20:17
von Earthnuker
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

Verfasst: Dienstag 19. August 2008, 20:38
von numerix
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

Verfasst: Dienstag 19. August 2008, 20:55
von Earthnuker
ich hab noch keinen code, darum brauche ich ja hilfe(bin noch n python noob) und mit tkinter hab ich noch nix gemacht

Verfasst: Dienstag 19. August 2008, 21:34
von numerix
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

Verfasst: Mittwoch 20. August 2008, 15:45
von Earthnuker
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

Verfasst: Mittwoch 20. August 2008, 16:08
von numerix
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 ...

Verfasst: Mittwoch 20. August 2008, 18:37
von Earthnuker
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

Verfasst: Mittwoch 20. August 2008, 18:44
von Leonidas
Lies doch die Tkinter-Dokumentation oder nutze die Suchfunktion.

Verfasst: Donnerstag 21. August 2008, 19:00
von Earthnuker
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

Verfasst: Donnerstag 21. August 2008, 19:38
von numerix
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.

Verfasst: Donnerstag 21. August 2008, 20:26
von Earthnuker

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)

Verfasst: Donnerstag 21. August 2008, 20:36
von numerix
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 ...

Verfasst: Donnerstag 21. August 2008, 23:10
von BlackJack
Naja, nicht nur lesen, *verstehen* ist auch nicht ganz unwichtig. ;-)

Verfasst: Freitag 22. August 2008, 18:23
von Earthnuker
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

Verfasst: Freitag 22. August 2008, 18:48
von numerix
Earthnuker hat geschrieben:so, fertig :) hab das ganze einfach auf nem fertigem scripr aufgebaut
Na dann.

Verfasst: Freitag 22. August 2008, 18:52
von Earthnuker
ü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