RTTTL : Ringtone text Transfert Langage --ET-- utilisation sous MicroPython
RTTTL... Kaseko?!?!?!?
Ring Tone Text Transfer Language (RTTTL) was developed by Nokia to be used to transfer ringtones to cellphone by Nokia. So it represent music data for play on older mobile phones.
Avec ce projet, nous serons capable de jouer des mélodies sur un Piezo Buzzer depuis une carte MicroPython.
La notation RTTTL est similaire au langage "Music Macro" que l'on retrouvait dans les implémentation des premiers micro-ordinateurs.
Constitution d'une chaîne RTTTL
Le format RTTTL est une chaine de caractère divisé en 3 sections:
- nom,
- valeurs par défaut,
- données.
Par exemple, voici une mélodie (RingTone) RTTTL pour maison hantée:
HauntHouse: d=4,o=5,b=108: 2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4, 1p, 2a4, 2e, 2d#, 2b4, 2a4, 2c, 2d, 2a#4, 2e., e, 1f4, 1a4, 1d#, 2e., d, 2c., b4, 1a4Voici une seconde mélodie RTTT:
fifth:d=4,o=5,b=63:8P,8G5,8G5,8G5,2D#5Partie 1: le "nom" indique le nom de la mélodie/ringtone. Il doit avoir maximum 10 caractères et ne peut pas contenur de caractère ":". A noter que les spécifications Smart Messaging autorise jusque 15 caractères de long, la plupart des applications RTTTL le supportent aussi.
Partie 2: les "valeurs par défaut" est une section qui permet de définir plusieurs valeurs par défaut séparées par une virgule. Chaque valeur par défaut est constituée d'une clé et d'une valeur séparés par un signe "=". Ces valeurs par défaut sont utilisées durant tout le temps d'exécution de la mélodie.
Les clés possibles sont:
- d : la durée
- o : octave
- b : beat, tempo
Partie 3: la section de données qui est constitutée d'un ensemble de chaînes de caractères séparées par une virgule. Chaque chaîne de caractères contient une durée, le pitch (hauteur de note), l'octave et un point (ce qui accroît la durée de la note d'une demi durée).
Voyez la section "Spécifications complémentaires" (plus loin) pour des détails sur les notes et les durées.
Bibliothèque
Dave Hylands à produit une excellente bibliothèque nommée rtttl.py qui est disponible sur le dépôt GitHub upy-rtttl.py .
De cette bibliothèque, copiez les fichiers suivants sur votre carte MicroPython:
- rtttl.py - le parser rtttl
- pyb_test.py - exemple qui joue deux mélodies (une de songs.py et une autre encodée dans l'exemple)
- songs.py - petite collection de mélodies RTTTL.
Raccordement
Voici le raccordement à faire sur une carte Pyboard.
Ce code fonctionnera tout aussi bien sur une PYBStick en utilisant la Broche S12, le timer 2 (et toujours le canal 1) .
Du code
Le code d'exemple est assez simple :-)
# # Exemple provenant de https://github.com/dhylands/upy-rtttl # import pyb from rtttl import RTTTL import songs # Y2 on pyboard buz_tim = pyb.Timer(8, freq=440) buz_ch = buz_tim.channel(2, pyb.Timer.PWM, pin=pyb.Pin('Y2'), pulse_width=0) pwm = 50 # reduce this to reduce the volume def play_tone(freq, msec): print('freq = {:6.1f} msec = {:6.1f}'.format(freq, msec)) if freq > 0: buz_tim.freq(freq) buz_ch.pulse_width_percent(pwm) pyb.delay(int(msec * 0.9)) buz_ch.pulse_width_percent(0) pyb.delay(int(msec * 0.1)) def play(tune): try: for freq, msec in tune.notes(): play_tone(freq, msec) except KeyboardInterrupt: play_tone(0, 0) def play_song(search): play(RTTTL(songs.find(search))) # play songs from songs.py play_song('Entertainer') # play songs directly play(RTTTL('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#'))
Il est également possible de jouer tous les exemples disponibles dans songs.py .
Il y a des excellents comme les Stroumph, les Muppets, Indiana Jones, Take One Me, StarWars, L'agence tout risques, ....
A écouter, c'est quand même fabuleux.
import pyb from rtttl import RTTTL import songs import time # Y2 on pyboard buz_tim = pyb.Timer(8, freq=440) buz_ch = buz_tim.channel(2, pyb.Timer.PWM, pin=pyb.Pin('Y2'), pulse_width=0) pwm = 50 # reduce this to reduce the volume def play_tone(freq, msec): print('freq = {:6.1f} msec = {:6.1f}'.format(freq, msec)) if freq > 0: buz_tim.freq(freq) buz_ch.pulse_width_percent(pwm) pyb.delay(int(msec * 0.9)) buz_ch.pulse_width_percent(0) pyb.delay(int(msec * 0.1)) def play(tune): try: for freq, msec in tune.notes(): play_tone(freq, msec) except KeyboardInterrupt: play_tone(0, 0) def play_song(search): play(RTTTL(songs.find(search))) # play songs from songs.py for song_str in songs.SONGS: play(RTTTL(song_str)) time.sleep( 2 ) print( "That s END" )
Spécifications complémentaires
Durées
La durée des notes est repris à l'aide de la notation suivante:
- 1 : note complète, noire
- 2 : demi note, croche
- 4 : quart de note, double croche
- 8 : 1/8 de note
- 16 : 1/16 de note
- 32 : 1/32 de note
Les notes pointées peut être formée en ajoutant un "." à la fin de l'élément de durée/rythme/octave. La note pointée prolonge la note de la moitié de sa durée.
Notes
Ici c'est la notation anglo-saxonne qui prévaut
- P : pause
- A : La
- A# : La♯ / Si♭
- B : Si / Do♭
- C : Do
- C# : Do♯ / Ré♭
- D : Ré
- D# : Ré♯ / Mi♭
- E : Mi / Fa♭
- F : Fa / E♯
- F# : Fa♯ / Sol♭
- G : Sol
- G# : Sol♯ / La♭
Octave
Le format RTTTL permet aux octaves de démarré du La (A) sous le Do moyen (C) et s'étend sur quatres octaves. Cela correspond au fait que certains téléphones cellulaires soient incapable de produire certaines tonalités de façon audible. Ces octaves sont numérotés depuis la note la plus basse (lowest pitch) à la note la plus haute (highest pitch) de 4 à 7.
L'octave devrait être laissé hors de la notation dans le cas d'une pause.
Ressources
- upy-rtttl.py - Ring Tone Text Transfert Language Parser (DaveHylands, GitHub)
- Piezo Ring Tones with Raspberry-Pi (learn.adafruit.com, anglais)
- Bibliothèque upy-rtttl pour MicroPython (Dave Hylands GitHub, Anglais)
- Collection de RingTone RTTTL (Picaxe.com, Anglais)
Plus de 10000 mélodies!!! - RTTTL sur Wikipedia (en.wikipedia.org, Anglais)
Écrire un commentaire