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.
Les 3 parties sont séparées par un double point ":".

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, 1a4
Voici une seconde mélodie RTTT:
fifth:d=4,o=5,b=63:8P,8G5,8G5,8G5,2D#5

Partie 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

Aucun commentaire