IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Les touches de piano [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Les touches de piano
    Là j'y vais mollo, car j'ai le syndrome de la flèche. L'effet de la flèche se fait en réalisant un parcours algorithmique à l'objet "cible".
    Lorsqu'on a toutes les informations concernant la gamme musicale, et qu'on veut faire comme tout le monde : Soit représenter les notes diatoniques sur un clavier virtuel.
    Je me demande quel est l'objet idéal pour représenter la touche du piano, qui pourrait se colorer, porter un nom, se sélectionner avec la souris

    Exemple d'idées : Utiliser une série de petits canvas, une série de frames, une série de boutons,,,

    Peut-être que vous avez quelqu'une réponse ?
    Dernière modification par Invité ; 08/11/2015 à 10h19. Motif: faute de français

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Citation Envoyé par toumic Voir le message
    Exemple d'idées : Utiliser une série de petits canvas, une série de frames, une série de boutons,,,
    Le Canvas serait le widget qui permettrait d'obtenir les meilleurs rendus (visuels) mais pour commencer et voir comment structurer le code, un tas de Button irait aussi bien.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    Ainsi que le conseil wiztricks, le bouton en première approche est ce qu'il y a de mieux.
    Et les boutons sont très personnalisables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import tkinter as tk
     
    fen = tk.Frame()
    fen.pack()
    def num_bt(x):
        print(x)
    bts = []
    for ind in range(10):
        bt = tk.Button(fen, text=str(ind), bg="ivory", bd=3,
                       command=lambda x=ind: num_bt(x), height=5, width=3,
                       cursor="hand1", activebackground="lightblue",
                       activeforeground="red", relief="groove")
        bt.pack(side="left")
        bts.append(bt)
     
    tk.mainloop()
    Sachant que, de plus, les boutons de "tkinter" peuvent afficher des images.

    Clodion

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hum, çà fend un air de vacances tout ceci
    Merci pour la copie, je vais en faire bon usage

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je reviens car en fait je crois que les touches ne vont pas pouvoir se superposer
    Il en va peut être de même avec les canevas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    import tkinter as tk
     
    fen1 = tk.Frame()
    fen1.pack()
    fen = tk.Frame()
    fen.pack()
    for ien in range(12):
        btn = tk.Button(fen1, text=str(ien), bg="black", bd=3,
                       command=lambda x=ien: num_bt(x), height=10, width=3,
                       cursor="hand1", activebackground="lightblue",
                       activeforeground="red", relief="groove")
        btn.pack(side="left")
    def num_bt(x):
        print(x)
    bts = []
    for ind in range(21):
        bt = tk.Button(fen, text=str(ind), bg="ivory", bd=3,
                       command=lambda x=ind: num_bt(x), height=10, width=3,
                       cursor="hand1", activebackground="lightblue",
                       activeforeground="red", relief="groove")
        bt.pack(side="left")
        bts.append(bt)
     
    tk.mainloop()

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par toumic Voir le message
    Je reviens car en fait je crois que les touches ne vont pas pouvoir se superposer
    Il en va peut être de même avec les canevas ?
    Avec des "Button" vous pouvez utilisez "place" au lieu de "pack" çà devrait permettre de superposer (modulo le Z-order). Avec le Canvas, vous pouvez faire aussi cela et/ou découper les touches blanches (un polygone à la place d'un simple rectangle) là ou se placent les touches noires.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'ai rafistolé un clavier composite avec deux rangées de boutons
    Une avec les notes blanches ayant "3" de largeur
    Et une autre avec les autres notes supposées ayant "2" de largeur
    Sauf trois éléments ayant "1" de largeur

    Il m'a été difficile de caler les deux portions, et la précision graphique est gênée par les options, telles: relief...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    import tkinter as tk
     
    fen1 = tk.Frame(width=7,height=1)
    fen1.pack()
    fen = tk.Frame(width=7,height=1)
    fen.pack()
    def num_bt(x):
        print(x)
    def num_btn(x):
        x=x
    bts = []
    for ind in range(21):
        bt = tk.Button(fen, text=str(ind), bg="ivory", bd=2,
                       command=lambda x=ind: num_bt(x), height=5, width=3,
                       cursor="hand1", activebackground="lightblue",
                       activeforeground="red", relief="groove")
        bt.pack(side="left")
        bts.append(bt)
    plumeau = ['gb','gn','pb','gn','gb','gb','gn','pb','gn','pb','gn','gb']
    btns = []
    for no in range(3):
        n=0
        for ien in plumeau:
            if ien == 'gb':
                btn = tk.Button(fen1, text='', bg="ivory", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=2,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            elif ien == 'pb':
                btn = tk.Button(fen1, text='', bg="ivory", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=1,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            elif ien == 'gn':
                btn = tk.Button(fen1, text='', bg="black", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=2,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            else:
                break
            n+=1
            btns.append(btn)
     
    tk.mainloop()

  8. #8
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par toumic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    import tkinter as tk
     
    fen1 = tk.Frame(width=7,height=1)
    fen1.pack()
    fen = tk.Frame(width=7,height=1)
    fen.pack()
    def num_bt(x):
        print(x)
    def num_btn(x):
        x=x
    bts = []
    for ind in range(21):
        bt = tk.Button(fen, text=str(ind), bg="ivory", bd=2,
                       command=lambda x=ind: num_bt(x), height=5, width=3,
                       cursor="hand1", activebackground="lightblue",
                       activeforeground="red", relief="groove")
        bt.pack(side="left")
        bts.append(bt)
    plumeau = ['gb','gn','pb','gn','gb','gb','gn','pb','gn','pb','gn','gb']
    btns = []
    for no in range(3):
        n=0
        for ien in plumeau:
            if ien == 'gb':
                btn = tk.Button(fen1, text='', bg="ivory", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=2,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            elif ien == 'pb':
                btn = tk.Button(fen1, text='', bg="ivory", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=1,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            elif ien == 'gn':
                btn = tk.Button(fen1, text='', bg="black", bd=0,
                                command=lambda x=n: num_btn(x), height=5, width=2,
                                cursor="hand1", activebackground="lightblue",
                                activeforeground="red")
                btn.pack(side="left")
            else:
                break
            n+=1
            btns.append(btn)
     
    tk.mainloop()
    Bonsoir,
    J'adore la fonction:

    Clodion

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par toumic Voir le message
    J'ai rafistolé un clavier composite avec deux rangées de boutons
    Puisque vous adorez bricoler amusez vous avec çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import tkinter as tk
     
    root = tk.Tk()
     
    for x in range(12):
        btn = tk.Button(text=x, height=10, width=3, bg='ivory', relief="groove")
        btn.place(x = 30*x, y = 0, anchor='nw')
     
    for x in range(11):
        r = x % 6
        print (r)
        if r and (r < 2 or r >= 3):
            btn = tk.Button(text=x, height=5, width=2, bg='black', relief="groove")
            btn.place(x = 30*x+15, y = 0, anchor='nw')
     
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Puisque vous adorez bricoler amusez vous avec çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import tkinter as tk
     
    root = tk.Tk()
     
    for x in range(12):
        btn = tk.Button(text=x, height=10, width=3, bg='ivory', relief="groove")
        btn.place(x = 30*x, y = 0, anchor='nw')
     
    for x in range(11):
        r = x % 6
        print (r)
        if r and (r < 2 or r >= 3):
            btn = tk.Button(text=x, height=5, width=2, bg='black', relief="groove")
            btn.place(x = 30*x+15, y = 0, anchor='nw')
     
    tk.mainloop()
    - W
    Il n'est pas possible de mélanger les .pack() avec les .place(). Et, comme j'ai commencé avec les .pack()...

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par toumic Voir le message
    Il n'est pas possible de mélanger les .pack() avec les .place(). Et, comme j'ai commencé avec les .pack()...
    Heu?! C'est quoi cette légende urbaine?
    Depuis Tcl/Tk 8.6 que vous avez avec Python 3.4+, un super message d'erreur s'affiche lorsque vous mélangez des grid managers incompatibles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> btn = tk.Button(frame)
    >>> btn.pack()
    >>> btn = tk.Button(frame)
    >>> btn.grid()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py34-64\lib\tkinter\__init__.py", line 2015, in grid_configure
     
        + self._options(cnf, kw))
    _tkinter.TclError: cannot use geometry manager grid inside .47865192 which already has slaves managed by pack
    Mais vous pouvez faire:
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Invité
    Invité(e)
    Par défaut
    J'avais juste oublié une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btns[1].configure(bg = "lightblue")
    Merci encore

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Puisque vous adorez bricoler amusez vous avec çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import tkinter as tk
     
    root = tk.Tk()
     
    for x in range(12):
        btn = tk.Button(text=x, height=10, width=3, bg='ivory', relief="groove")
        btn.place(x = 30*x, y = 0, anchor='nw')
     
    for x in range(11):
        r = x % 6
        print (r)
        if r and (r < 2 or r >= 3):
            btn = tk.Button(text=x, height=5, width=2, bg='black', relief="groove")
            btn.place(x = 30*x+15, y = 0, anchor='nw')
     
    tk.mainloop()
    - W
    C'était assez amusant et plus que mon rafistolage, il ne me reste plus qu'à faire de même ailleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    import tkinter as tk
     
    root = tk.Tk()
     
    for x in range(21):
        btn = tk.Button(text=x, height=10, width=3, bg='ivory', relief="groove")
        btn.place(x = 30*x, y = 0, anchor='nw')
     
    o = 0
    for x in range(21):
        print (x)
        if o == 2 or o == 6:
            pass
        else:
            btn = tk.Button(text=x, height=5, width=2, bg='black', relief="groove")
            btn.place(x = 30*x+15, y = 0, anchor='nw')
        o += 1
        if o > 6:
            o = 0
     
    tk.mainloop()

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je n'y arrive pas

    un toplevel.pack()=Pour une fenêtre
    un frame.pack()=Pour un cadre
    un bouton.place()=Pour un comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btn.place(x = 30*x+15, y = 0, anchor='nw')
    Non, vraiment je ne crois pas que ce soit possible

    Sinon, les boutons s'affichent sur la fenêtre principale, ce que je veux éviter...

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par toumic Voir le message
    Sinon, les boutons s'affichent sur la fenêtre principale, ce que je veux éviter...
    Et ben, vous créez vos Button "fils d'une" Frame que vous allez pouvoir .packer dans un Toplevel.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Invité
    Invité(e)
    Par défaut
    Je me suis dit, si çà s'affiche sur la fenêtre principale. Ils pourraient aussi bien se poser sur la toplevel dédiée
    Sauf que la fenêtre de la tablature, j'ai du mal à la dimensionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    def tabla(self):
                    if self.prestabla[0] == 1:
                            self.tur.destroy()
                            self.prestabla[0] = 0
                            self.bttab.invoke()
                    else:
                            self.prestabla[0] = 1
                            # Tonice(0). Tonale(1:3). Mélode(4:14). Médiane(15:18). Domine(19:42). Harmone(43:65)
                            # self.gamnomscopie : exemple(self.gamnomscopie[tbltr] == (noms)gammes concernées par ce type)
                            # self.gammescopie : exemple(self.gammescopie[tbltr] == (valeurs)gammes concernées par ce type)
                            tbltr_typ = [0, 1, 3, 4, 14, 15, 18, 19, 42, 43, 65]    # Indices des rangs par type (min:max)
                            tbltr_nom = ['Tonice','Tonale','Mélode','Médiane','Domine','Harmone']   # Noms donnés aux types
                            self.tur = Toplevel(self)
                            self.tur.title('Entité Gammique : Tablature')
                            # Cadre de visualisation : Tablatures
                            frtur = Frame(self.tur,width=30,height=1)
                            frtur.pack(side=BOTTOM)
                            bttur_p = Button(frtur,text ='Table piano',height=1, width=30,bg ='ivory', command=lambda: self.actuac(6))
                            bttur_p.pack(side = LEFT)
                            bttur_g = Button(frtur,text ='Table guitare',height=1, width=30,bg ='ivory', command=lambda: self.actuac(7))
                            bttur_g.pack(side = RIGHT)
                            # Cadre instrument tablature piano
                            bts = []
                            for x in range(21):
                                    bt = Button(self.tur,text=x, height=10, width=3, bg='ivory', relief="groove")
                                    bt.place(x = 30*x, y = 0, anchor='nw')
                                    bts.append(bt)
                            btns = []
                            o = 0
                            for x in range(21):
                                    if o == 2 or o == 6:
                                            pass
                                    else:
                                            btn = Button(self.tur,text=x, height=5, width=2, bg='black', relief="groove")
                                            btn.place(x = 30*x+15, y = 0, anchor='nw')
                                    o += 1
                                    if o > 6:
                                            o = 0
                                    btns.append(btn)
                            # self.turmaj : Table des notes blanches
                            # self.tablenotes : Conteneur diatonique (x)
    Plus maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.tur.geometry('700x200+10+10')
    Dernière modification par Invité ; 09/11/2015 à 20h53. Motif: Réponse rapide 8^)

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonsoir
    J'ai fini ma leçon de piano codée python, mais il fallait quand même lui expliquer certaines modalités.
    Le temps d'un match de ping-pong, et hop. Direct Petit piano avec winsound
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    import tkinter as tk
    import winsound
     
    root = tk.Tk()
    root.title('petit piano')
    root.geometry('650x250+10+10')
     
    gen_b = [3,5,7,8,10,12,14,15,17,19,20,22,24,26,27,29,31,32,34,36,38]
    gen_n = [4,6,-1,9,11,13,-1,16,18,-1,21,23,25,-1,28,30,-1,33,35,37]
     
    freq = f12 = 0 ; f0 = 220
    tab_freqs = []
    for ai in range(39):        # Construction tableau TM
        if 0 <= ai < 12: la = f0
        elif 24 > ai > 11: la = f0*2
        elif 36 > ai > 23: la = f0*4
        elif ai > 35: la = f0*8
        f1 = la/2 ; f2 = f1/12
        freq=f12*f2+f1          # Calcul fréquence
        tab_freqs.append(freq)  # Tableau en écriture TM
        f12+=1
        if f12 > 11:
            f12 = 0
     
    def piano_b(m):
        duration=200
        freqhtz = int(tab_freqs[gen_b[m]])
        winsound.Beep(freqhtz, duration)
    def piano_n(m):
        duration=200
        freqhtz = int(tab_freqs[gen_n[m]])
        winsound.Beep(freqhtz, duration)
     
    btbs = []
    for x in range(21):
        btb = tk.Button(text=x, height=10, width=3, bg='ivory', command=lambda m=x: piano_b(m), relief="groove")
        btb.place(x = 30*x, y = 30, anchor='nw')
        btbs.append(btb)
     
    o = 0
    btns = []
    for x in range(21):
        if o == 2 or o == 6:
            pass
        else:
            btn = tk.Button(text=x, height=5, width=2, bg='black',command=lambda m=x: piano_n(m), relief="groove")
            btn.place(x = 30*x+15, y = 30, anchor='nw')
            btns.append(btn)
        o += 1
        if o > 6:
            o = 0
     
    tk.mainloop()
    Dernière modification par Invité ; 11/11/2015 à 20h45. Motif: Attention message figuratif !!!

  18. #18
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Pour que cela fonctionne chez moi (Ubuntu), j'ai modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    import numpy
    import pyaudio
    import math
     
     
    class ToneGenerator(object):
     
        def __init__(self, samplerate=44100, frames_per_buffer=4410):
            self.p = pyaudio.PyAudio()
            self.samplerate = samplerate
            self.frames_per_buffer = frames_per_buffer
            self.streamOpen = False
     
        def sinewave(self):
            if self.buffer_offset + self.frames_per_buffer - 1 > self.x_max:
                # We don't need a full buffer or audio so pad the end with 0's
                xs = numpy.arange(self.buffer_offset,
                                  self.x_max)
                tmp = self.amplitude * numpy.sin(xs * self.omega)
                out = numpy.append(tmp,
                                   numpy.zeros(self.frames_per_buffer - len(tmp)))
            else:
                xs = numpy.arange(self.buffer_offset,
                                  self.buffer_offset + self.frames_per_buffer)
                out = self.amplitude * numpy.sin(xs * self.omega)
            self.buffer_offset += self.frames_per_buffer
            return out
     
        def callback(self, in_data, frame_count, time_info, status):
            if self.buffer_offset < self.x_max:
                data = self.sinewave().astype(numpy.float32)
                return (data.tostring(), pyaudio.paContinue)
            else:
                return (None, pyaudio.paComplete)
     
        def is_playing(self):
            if self.stream.is_active():
                return True
            else:
                if self.streamOpen:
                    self.stream.stop_stream()
                    self.stream.close()
                    self.streamOpen = False
                return False
     
        def play(self, frequency, duration, amplitude=0.5):
            self.omega = float(frequency) * (math.pi * 2) / self.samplerate
            self.amplitude = amplitude
            self.buffer_offset = 0
            self.streamOpen = True
            self.x_max = math.ceil(self.samplerate * duration) - 1
            self.stream = self.p.open(format=pyaudio.paFloat32,
                                      channels=1,
                                      rate=self.samplerate,
                                      output=True,
                                      frames_per_buffer=self.frames_per_buffer,
                                      stream_callback=self.callback)
     
    generator = ToneGenerator()
    Cependant, les fréquences ne sont pas bonnes. Est-ce lié à linux ou bien ?

  19. #19
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Pour que cela fonctionne chez moi (Ubuntu), j'ai modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    import numpy
    import pyaudio
    import math
     
     
    class ToneGenerator(object):
     
        def __init__(self, samplerate=44100, frames_per_buffer=4410):
            self.p = pyaudio.PyAudio()
            self.samplerate = samplerate
            self.frames_per_buffer = frames_per_buffer
            self.streamOpen = False
     
        def sinewave(self):
            if self.buffer_offset + self.frames_per_buffer - 1 > self.x_max:
                # We don't need a full buffer or audio so pad the end with 0's
                xs = numpy.arange(self.buffer_offset,
                                  self.x_max)
                tmp = self.amplitude * numpy.sin(xs * self.omega)
                out = numpy.append(tmp,
                                   numpy.zeros(self.frames_per_buffer - len(tmp)))
            else:
                xs = numpy.arange(self.buffer_offset,
                                  self.buffer_offset + self.frames_per_buffer)
                out = self.amplitude * numpy.sin(xs * self.omega)
            self.buffer_offset += self.frames_per_buffer
            return out
     
        def callback(self, in_data, frame_count, time_info, status):
            if self.buffer_offset < self.x_max:
                data = self.sinewave().astype(numpy.float32)
                return (data.tostring(), pyaudio.paContinue)
            else:
                return (None, pyaudio.paComplete)
     
        def is_playing(self):
            if self.stream.is_active():
                return True
            else:
                if self.streamOpen:
                    self.stream.stop_stream()
                    self.stream.close()
                    self.streamOpen = False
                return False
     
        def play(self, frequency, duration, amplitude=0.5):
            self.omega = float(frequency) * (math.pi * 2) / self.samplerate
            self.amplitude = amplitude
            self.buffer_offset = 0
            self.streamOpen = True
            self.x_max = math.ceil(self.samplerate * duration) - 1
            self.stream = self.p.open(format=pyaudio.paFloat32,
                                      channels=1,
                                      rate=self.samplerate,
                                      output=True,
                                      frames_per_buffer=self.frames_per_buffer,
                                      stream_callback=self.callback)
     
    generator = ToneGenerator()
    Cependant, les fréquences ne sont pas bonnes. Est-ce lié à linux ou bien ?
    Pour moi, le plus juste c'est 1/12. Il n'y aura pas plus juste que çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    freq = f12 = 0 ; f0 = 220
    tab_freqs = []
    for ai in range(39):        # Construction tableau TM
        if 0 <= ai < 12: la = f0
        elif 24 > ai > 11: la = f0*2
        elif 36 > ai > 23: la = f0*4
        elif ai > 35: la = f0*8
        f1 = la/2 ; f2 = f1/12
        freq=f12*f2+f1          # Calcul fréquence
        tab_freqs.append(freq)  # Tableau en écriture TM
        f12+=1
        if f12 > 11:
            f12 = 0
    Mais quel phénomène s'est présenté pour dire que ce n'est pas juste ?

  20. #20
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par toumic Voir le message
    Pour moi, le plus juste c'est 1/12. Il n'y aura pas plus juste que çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    freq = f12 = 0 ; f0 = 220
    tab_freqs = []
    for ai in range(39):        # Construction tableau TM
        if 0 <= ai < 12: la = f0
        elif 24 > ai > 11: la = f0*2
        elif 35 > ai > 23: la = f0*4
        elif ai > 35: la = f0*8
        f1 = la/2 ; f2 = f1/12
        freq=f12*f2+f1          # Calcul fréquence
        tab_freqs.append(freq)  # Tableau en écriture TM
        f12+=1
        if f12 > 11:
            f12 = 0
    Mais quel phénomène s'est présenté pour dire que ce n'est pas juste ?
    Les notes sont fausses, tout simplement.
    Il va falloir que j'essaie sous windaube.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/09/2005, 20h46
  2. [TMemo] Comment insérer les touches pressées ?
    Par Alexandre` dans le forum Composants VCL
    Réponses: 8
    Dernier message: 28/03/2005, 16h36
  3. Problème avec les touches CTRL & FONCTIONS
    Par bidule999 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 03/12/2004, 09h52
  4. Désactiver les touches F1, F2, F3, F4, F5 dans IE
    Par ZiZouJH dans le forum Flash
    Réponses: 7
    Dernier message: 17/02/2003, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo