Différences entre versions de « P2E-Buzzer-Music-FR »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
(Page créée avec « {{P2E-NAV}} == Introduction == Dans le [P2E-Buzzer-PWM-FR|tutoriel consacré au Buzzer]], nous avons découvert qu'un signal PWM pouvait être utilisé pour produire une… »)
 
 
(34 versions intermédiaires par le même utilisateur non affichées)
Ligne 2 : Ligne 2 :
  
 
== Introduction ==
 
== Introduction ==
Dans le [P2E-Buzzer-PWM-FR|tutoriel consacré au Buzzer]], nous avons découvert qu'un signal PWM pouvait être utilisé pour produire une tonalité et des notes.
+
Dans le [[P2E-Buzzer-PWM-FR|tutoriel consacré au Buzzer]], nous avons découvert qu'un signal PWM pouvait être utilisé pour produire une tonalité et des notes.
  
Il existe aussi un langage nommé RTTTL relativement simple permettant d'encoder une mélodie sous forme d'une caractères.
+
'''Ring Tone Text Transfer Language''' (RTTTL) a été développé par Nokia pour permettre le transfert de mélodies (appelée "''ringtones''") vers un téléphone portable Nokia.
__Ring Tone Text Transfer Language__ (RTTTL) a été développé par Nokia pour permettre le transfert de mélodies (appelée "_ringtones_") vers un téléphone portable Nokia.
 
 
Pour l'époque, cette possibilité de personnaliser la sonnerie du téléphone fît du Nokia 3310, l'un des téléphones les plus vendu de sa génération.
 
Pour l'époque, cette possibilité de personnaliser la sonnerie du téléphone fît du Nokia 3310, l'un des téléphones les plus vendu de sa génération.
  
 
[[Fichier:P2E-Buzzer-RTTTL-10.jpg]]
 
[[Fichier:P2E-Buzzer-RTTTL-10.jpg]]
  
 +
Un buzzer peut aussi être contrôlé par un langage nommé RTTTL permettant de codifier une mélodie sous forme d'une chaîne de caractères dont voici un exemple:
  
RTTTL représente donc une mise en données de la musique destinée à être jouée sur un téléphone mobile.
+
<nowiki>Axel-F:d=4,o=5,b=125:g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,
 +
8d,8a#,2g,p,16f6,8d6,8c6,8a#,g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,
 +
16p,16f,8d,8a#,2g</nowiki>
  
 +
 +
== Bibliothèque ==
 +
 +
La bibliothèque nécessaire est déjà installée sur le Raspberry-Pi Pico du Pico-2-Explorer.
 +
 +
Il est possible de l'installée sur un autre Raspberry-Pi Pico depuis le dépôt [https://github.com/mchobby/upy-rtttl upy-rtttl disponible ici sur Github].
 +
 +
Il est également possible de ''trouver de nombreux RingTones RTTTL'' sur:
 +
* [http://www.picaxe.com/RTTTL-Ringtones-for-Tune-Command/ www.picaxe.com]
 +
* des [https://github.com/mchobby/pico-2-explorer/tree/main/music archives ringtones sur pico-2-explorer/music]
 +
 +
{{underline|Crédit:}} la présente bibliothèque est une amélioration du dépôt [https://github.com/dhylands/upy-rtttl de D.Hylands].
 +
 +
== Cas pratique ==
 +
 +
Dans cet exemple, nous allons utiliser un interpréteur RTTTL pour reproduire les mélodies simples tels quelles étaient produite sur les téléphones Nokia de premières générations.
 +
 +
Derrière ce style évidemment rétro, il est possible de reconnaître des thèmes éminemment connus.
  
 
=== Branchement simplifié ===
 
=== Branchement simplifié ===
 +
Pour que les exemples fonctionnent correctement, il faut vérifier la présence du Cavalier.
  
Dans cet exemple, nous allons utiliser un interpréteur RTTTTL pour reproduire les mélodies simples tels quelles étaient produite sur les téléphones Nokia de premières générations.
+
[[Fichier:P2E-Music-25.png|800px]]
  
Derrière ce style évidemment rétro, il est possible de reconnaître des thèmes éminemment connus.
+
Le cavalier raccorde la broche GP13 sur le circuit de commande du piezo buzzer.
  
[[Fichier:P2E-Buzzer-PWM-25.png|800px]]
+
[[Fichier:P2E-Buzzer-PWM-20.png]]
  
 
{{underline|Remarque:}}
 
{{underline|Remarque:}}
Ligne 26 : Ligne 47 :
 
* Il est bien entendu possible d'interrompre la production du son (le générateur PWM) en pressant le bouton RESET de la carte'''.
 
* Il est bien entendu possible d'interrompre la production du son (le générateur PWM) en pressant le bouton RESET de la carte'''.
  
=== Code ===
+
=== Code simple ===
 +
 
 +
Les codes ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
 +
 
 +
Cet exemple est également disponible dans le dépôt dans le sous répertoire music ([https://github.com/mchobby/pico-2-explorer/tree/main/music music1.py] et [https://github.com/mchobby/pico-2-explorer/tree/main/music music2.py] ).
 +
 
 +
<syntaxhighlight lang="python" line highlight="2,4,6">
 +
from machine import Pin
 +
from rtplay import *
 +
 
 +
buzzer = RingTonePlayer( Pin.board.GP13 )
 +
 
 +
buzzer.play_str( 'Monty Python:d=8,o=5,b=180:d#6,d6,4c6,b,4a#,a,4g#,g,f,g,g#,4g,f,2a#,p,a#,g,p,g,g,f#,g,d#6,p,a#,a#,p,g,g#,p,g#,g#,p,a#,2c6,p,g#,f,p,f,f,e,f,d6,p,c6,c6,p,g#,g,p,g,g,p,g#,2a#,p,a#,g,p,g,g,f#,g,g6,p,d#6,d#6,p,a#,a,p,f6,f6,p,f6,2f6,p,d#6,4d6,f6,f6,e6,f6,4c6,f6,f6,e6,f6,a#,p,a,a#,p,a,2a#' )
 +
</syntaxhighlight>
 +
 
 +
Voici quelques explications utiles:
 +
* '''Ligne 2''': permet d'importer la classe RingTonePlayer
 +
* '''Ligne 4''': création de la classe RingTonePlayer en indiquant la broche contrôlant le Piezo Buzzer. L'objet créé prend en charge la création et le contrôle PWM.
 +
* '''Ligne 6''': Jouer la mélodie "Monty Python".
 +
 
 +
La bibliothèque contient également les fichiers {{fname|songs.py}} ([https://github.com/mchobby/upy-rtttl/blob/master/lib/songs.py visible ici]) et {{fname|songs2.py}} ([https://github.com/mchobby/upy-rtttl/blob/master/lib/songs2.py visible ici]) contenant des mini-collections de mélodies.
 +
 
 +
Ces fichiers peuvent être chargés à la demande pour jouer l'une au l'autre des mélodies qu'elle contient.
  
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
+
L'exemple ci-dessous indique comment charger le fichier "songs.py" pour jouer le thème d'Indiana Jones.
  
Cet exemple est également disponible dans le dépôt [https://github.com/mchobby/pico-2-explorer/tree/main/buzzer pwm-buzzer.py] .
+
<syntaxhighlight lang="python" line highlight="6,7">
 +
from machine import Pin
 +
from rtplay import *
  
<syntaxhighlight lang="python" line highlight="2,6,9,10,13,14">
+
buzzer = RingTonePlayer( Pin.board.GP13 )
from machine import Pin, ADC, PWM
+
 
from maps import map
+
buzzer.load_songs( 'songs.py' )
 +
buzzer.play_song( 'Indiana' )
 +
</syntaxhighlight>
 +
 
 +
Voici quelques explications utiles:
 +
* '''Ligne 6''': chargement dynamique du fichier "songs.py". La collection SONGS qu'il contient est maintenant enregistré dans l'objet {{fname|buzzer}}.
 +
* '''Ligne 7''': localisation de la mélodie "Indiana" et interprétation de celle-ci sur le buzzer.
 +
 
 +
=== Code avancé ===
 +
 
 +
En utilisant la méthode {{fname|RingTonePlayer.dir_songs()}}, il est possible d'obtenir une liste des mélodies disponibles.
 +
 
 +
L'exemple ci-dessous joue tour-à-tour toutes les mélodies disponibles dans le fichier {{fname|songs.py}}. Le script est disponible dans le fichier [https://github.com/mchobby/pico-2-explorer/tree/main/music music/music_all.py].
 +
 
 +
<syntaxhighlight lang="python" line highlight="6,7,11,13">
 +
from machine import Pin
 +
from rtplay import *
 
import time
 
import time
  
# Désactive PowerSafe (lower ripple)
+
buzzer = RingTonePlayer( Pin.board.GP13 )
Pin( 23, Pin.OUT, value=True )
+
buzzer.load_songs( 'songs.py' )
 +
names = buzzer.dir_songs()
 +
print( "Available songs :" )
 +
print( names )
 +
print( "" )
 +
for name in names:
 +
print( "Playing %s ..." % name )
 +
buzzer.play_song( name )
 +
time.sleep( 2 )
 +
print( "" )
 +
</syntaxhighlight>
 +
 
 +
Voici quelques détails utiles concernant l'exemple:
 +
* '''Ligne 6''': chargement dynamique du fichier "songs.py". La collection SONGS qu'il contient est maintenant enregistré dans l'objet {{fname|buzzer}}.
 +
* '''Ligne 7''': la méthode {{fname|dir_songs()}} permet d'obtenir une liste des noms de mélodie (contenu dans le fichier songs.py chargé).
 +
* '''Ligne 11''': utilisation d'une boucle {{fname|for}} pour itérer, un à un, les différents noms de mélodies collecté en ligne 7.
 +
* '''Ligne 13''': jouer la mélodie identifiée par son nom.
  
a0 = ADC( Pin( Pin.board.GP26 ) )
+
En plus du rendu audio, voici le résultat affiché dans la session REPL.
buzzer = PWM( Pin( Pin.board.GP13 ) )
+
 
buzzer.duty_u16( 65535//3 )
+
<nowiki>Available songs :
while True:
+
['Super Mario - Main Theme', 'Super Mario - Title Music', 'SMBtheme', 'SMBwater', 'SMBunderground', 'Picaxe', 'The Simpsons', 'Indiana', 'TakeOnMe', 'Entertainer', 'Muppets', 'Xfiles', 'Looney', '20thCenFox', 'Bond', 'MASH', 'StarWars', 'GoodBad', 'TopGun', 'A-Team', 'Flinstones', 'Jeopardy', 'Gadget', 'Smurfs', 'MahnaMahna', 'LeisureSuit', 'MissionImp']
    val = a0.read_u16()
+
 
    hertz = int( map(val, 0, 65535, 100, 10000 ) )
+
Playing Super Mario - Main Theme ...
    buzzer.freq( hertz )
+
Playing Super Mario - Title Music ...
    print( 'frequence = %5i Hz' % (hertz) )
+
Playing SMBtheme ...
    time.sleep_ms( 100 )
+
Playing SMBwater ...
</syntaxhighlight>
+
Playing SMBunderground ...
 +
Playing Picaxe ...
 +
Playing The Simpsons ...
 +
Playing Indiana ...
 +
Playing TakeOnMe ...
 +
Playing Entertainer ...
 +
Playing Muppets ...
 +
Playing Xfiles ...
 +
Playing Looney ...
 +
Playing 20thCenFox ...
 +
Playing Bond ...
 +
Playing MASH ...
 +
Playing StarWars ...
 +
Playing GoodBad ...
 +
Playing TopGun ...
 +
Playing A-Team ...
 +
Playing Flinstones ...
 +
Playing Jeopardy ...
 +
Playing Gadget ...
 +
Playing Smurfs ...
 +
Playing MahnaMahna ...
 +
Playing LeisureSuit ...
 +
Playing MissionImp ...
 +
</nowiki>
 +
 
 +
== Un problème? ==
 +
 
 +
Pas de son ?
 +
# Est ce que le code est en cours d'exécution ?
 +
## OUI: vérifier la présence du cavalier près de
 +
## NON: vérifier le raccordement entre le GP26 et le potentiomètre
 +
 
 +
Le son est trop faible ?
 +
# avez-vous diminuer la valeur de {{fname|RingTonePlayer.pwm_vol}} ? (de 0 à 100, valeur par défaut 50)
 +
# augmentez la valeur de {{fname|RingTonePlayer.pwm_vol}} à 60.
 +
 
 +
== Le défi ==
 +
1. Sur base des exemples ci-dessous, opérer les modifications nécessaires pour jouer les mélodies contenues dans songs2.py .
 +
 
 +
2. Créer votre propre fichier {{fname|mysongs.py}} en utilisant [https://github.com/mchobby/upy-rtttl/blob/master/lib/songs.py songs.py comme modèle]. Ensuite, copiez-le sur la carte micropython. Finalement, utilisez votre fichier {{fname|mysongs.py}} pour jouer vos propres mélodies.

Version actuelle datée du 28 janvier 2025 à 22:35

Introduction

Dans le tutoriel consacré au Buzzer, nous avons découvert qu'un signal PWM pouvait être utilisé pour produire une tonalité et des notes.

Ring Tone Text Transfer Language (RTTTL) a été développé par Nokia pour permettre le transfert de mélodies (appelée "ringtones") vers un téléphone portable Nokia. Pour l'époque, cette possibilité de personnaliser la sonnerie du téléphone fît du Nokia 3310, l'un des téléphones les plus vendu de sa génération.

P2E-Buzzer-RTTTL-10.jpg

Un buzzer peut aussi être contrôlé par un langage nommé RTTTL permettant de codifier une mélodie sous forme d'une chaîne de caractères dont voici un exemple:

Axel-F:d=4,o=5,b=125:g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,
8d,8a#,2g,p,16f6,8d6,8c6,8a#,g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,
16p,16f,8d,8a#,2g


Bibliothèque

La bibliothèque nécessaire est déjà installée sur le Raspberry-Pi Pico du Pico-2-Explorer.

Il est possible de l'installée sur un autre Raspberry-Pi Pico depuis le dépôt upy-rtttl disponible ici sur Github.

Il est également possible de trouver de nombreux RingTones RTTTL sur:

Crédit: la présente bibliothèque est une amélioration du dépôt de D.Hylands.

Cas pratique

Dans cet exemple, nous allons utiliser un interpréteur RTTTL pour reproduire les mélodies simples tels quelles étaient produite sur les téléphones Nokia de premières générations.

Derrière ce style évidemment rétro, il est possible de reconnaître des thèmes éminemment connus.

Branchement simplifié

Pour que les exemples fonctionnent correctement, il faut vérifier la présence du Cavalier.

P2E-Music-25.png

Le cavalier raccorde la broche GP13 sur le circuit de commande du piezo buzzer.

P2E-Buzzer-PWM-20.png

Remarque:

  • Le script peut être interrompu mais cela n'interrompt pas la génération du son puisque qu'un contrôleur PWM est autonome.
  • Il est bien entendu possible d'interrompre la production du son (le générateur PWM) en pressant le bouton RESET de la carte.

Code simple

Les codes ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.

Cet exemple est également disponible dans le dépôt dans le sous répertoire music (music1.py et music2.py ).

1 from machine import Pin
2 from rtplay import *
3 
4 buzzer = RingTonePlayer( Pin.board.GP13 )
5 
6 buzzer.play_str( 'Monty Python:d=8,o=5,b=180:d#6,d6,4c6,b,4a#,a,4g#,g,f,g,g#,4g,f,2a#,p,a#,g,p,g,g,f#,g,d#6,p,a#,a#,p,g,g#,p,g#,g#,p,a#,2c6,p,g#,f,p,f,f,e,f,d6,p,c6,c6,p,g#,g,p,g,g,p,g#,2a#,p,a#,g,p,g,g,f#,g,g6,p,d#6,d#6,p,a#,a,p,f6,f6,p,f6,2f6,p,d#6,4d6,f6,f6,e6,f6,4c6,f6,f6,e6,f6,a#,p,a,a#,p,a,2a#' )

Voici quelques explications utiles:

  • Ligne 2: permet d'importer la classe RingTonePlayer
  • Ligne 4: création de la classe RingTonePlayer en indiquant la broche contrôlant le Piezo Buzzer. L'objet créé prend en charge la création et le contrôle PWM.
  • Ligne 6: Jouer la mélodie "Monty Python".

La bibliothèque contient également les fichiers songs.py (visible ici) et songs2.py (visible ici) contenant des mini-collections de mélodies.

Ces fichiers peuvent être chargés à la demande pour jouer l'une au l'autre des mélodies qu'elle contient.

L'exemple ci-dessous indique comment charger le fichier "songs.py" pour jouer le thème d'Indiana Jones.

1 from machine import Pin
2 from rtplay import *
3 
4 buzzer = RingTonePlayer( Pin.board.GP13 )
5 
6 buzzer.load_songs( 'songs.py' )
7 buzzer.play_song( 'Indiana' )

Voici quelques explications utiles:

  • Ligne 6: chargement dynamique du fichier "songs.py". La collection SONGS qu'il contient est maintenant enregistré dans l'objet buzzer.
  • Ligne 7: localisation de la mélodie "Indiana" et interprétation de celle-ci sur le buzzer.

Code avancé

En utilisant la méthode RingTonePlayer.dir_songs(), il est possible d'obtenir une liste des mélodies disponibles.

L'exemple ci-dessous joue tour-à-tour toutes les mélodies disponibles dans le fichier songs.py. Le script est disponible dans le fichier music/music_all.py.

 1 from machine import Pin
 2 from rtplay import *
 3 import time
 4 
 5 buzzer = RingTonePlayer( Pin.board.GP13 )
 6 buzzer.load_songs( 'songs.py' )
 7 names = buzzer.dir_songs()
 8 print( "Available songs :" )
 9 print( names )
10 print( "" )
11 for name in names:
12 	print( "Playing %s ..." % name )
13 	buzzer.play_song( name )
14 	time.sleep( 2 )
15 	print( "" )

Voici quelques détails utiles concernant l'exemple:

  • Ligne 6: chargement dynamique du fichier "songs.py". La collection SONGS qu'il contient est maintenant enregistré dans l'objet buzzer.
  • Ligne 7: la méthode dir_songs() permet d'obtenir une liste des noms de mélodie (contenu dans le fichier songs.py chargé).
  • Ligne 11: utilisation d'une boucle for pour itérer, un à un, les différents noms de mélodies collecté en ligne 7.
  • Ligne 13: jouer la mélodie identifiée par son nom.

En plus du rendu audio, voici le résultat affiché dans la session REPL.

Available songs :
['Super Mario - Main Theme', 'Super Mario - Title Music', 'SMBtheme', 'SMBwater', 'SMBunderground', 'Picaxe', 'The Simpsons', 'Indiana', 'TakeOnMe', 'Entertainer', 'Muppets', 'Xfiles', 'Looney', '20thCenFox', 'Bond', 'MASH', 'StarWars', 'GoodBad', 'TopGun', 'A-Team', 'Flinstones', 'Jeopardy', 'Gadget', 'Smurfs', 'MahnaMahna', 'LeisureSuit', 'MissionImp']

Playing Super Mario - Main Theme ...
Playing Super Mario - Title Music ...
Playing SMBtheme ...
Playing SMBwater ...
Playing SMBunderground ...
Playing Picaxe ...
Playing The Simpsons ...
Playing Indiana ...
Playing TakeOnMe ...
Playing Entertainer ...
Playing Muppets ...
Playing Xfiles ...
Playing Looney ...
Playing 20thCenFox ...
Playing Bond ...
Playing MASH ...
Playing StarWars ...
Playing GoodBad ...
Playing TopGun ...
Playing A-Team ...
Playing Flinstones ...
Playing Jeopardy ...
Playing Gadget ...
Playing Smurfs ...
Playing MahnaMahna ...
Playing LeisureSuit ...
Playing MissionImp ...

Un problème?

Pas de son ?

  1. Est ce que le code est en cours d'exécution ?
    1. OUI: vérifier la présence du cavalier près de
    2. NON: vérifier le raccordement entre le GP26 et le potentiomètre

Le son est trop faible ?

  1. avez-vous diminuer la valeur de RingTonePlayer.pwm_vol ? (de 0 à 100, valeur par défaut 50)
  2. augmentez la valeur de RingTonePlayer.pwm_vol à 60.

Le défi

1. Sur base des exemples ci-dessous, opérer les modifications nécessaires pour jouer les mélodies contenues dans songs2.py .

2. Créer votre propre fichier mysongs.py en utilisant songs.py comme modèle. Ensuite, copiez-le sur la carte micropython. Finalement, utilisez votre fichier mysongs.py pour jouer vos propres mélodies.