π
<-

News 2024
August (1)
July (1)
June (4)
April (2)

News 2023
August (2)
July (1)
June (3)
May (4)
April (1)

News 2022
August (3)
June (1)
May (1)
March (2)

News 2021
August (12)
July (1)
June (2)
May (7)
April (3)
March (1)

News 2020
August (15)
July (2)
June (7)
May (7)
April (19)
March (4)

News 2019
August (4)
July (7)
June (6)
May (1)
April (3)
March (1)

News 2018
August (11)
July (8)
June (3)
May (10)
April (2)
March (4)

News 2017
August (15)
July (18)
June (1)
May (7)
April (4)
March (7)

News 2016
August (17)
July (16)
June (2)
May (2)
April (1)
March (5)

News 2015
August (25)
July (1)
June (4)
May (9)
April (4)
March (10)

News 2014
August (4)
July (4)
June (11)
May (12)
April (9)
March (12)
January (13)

News 2013
October (11)
August (5)
July (5)
June (9)
May (12)
April (10)
March (7)
January (10)

News 2012
August (12)
July (10)
June (13)
May (22)
April (8)
March (5)

News 2011
October (23)
August (1)
July (7)
June (29)
May (11)
April (5)
March (3)

News 2010
August (2)
July (2)
June (5)

News 2009
August (1)
July (1)
June (1)
May (1)
April (1)
March (1)

img2calc: convertis tes images à afficher sur TI-RGB Array

New postby critor » 28 May 2021, 10:54

13917img2calc est notre service universel de conversion d'images pour calculatrices graphiques.

À ce jour selon les cas, il te génère soit des fichiers ou variables à appeler depuis tes programmes Basic ou scripts Python, soit directement des scripts Python intégrant l'image en question.

1392913930Dans ce dernier cas, nous te rajoutions hier la possibilité de convertir des images pour un affichage sur BBC micro:bit.

Autre grande nouveauté aujourd'hui, tu peux maintenant convertir tes images en scripts Python permettant à ta calculatrice de les afficher sur la grille TI-RGB Array ! :bj:

En effet la grille TI-RGB Array dispose de 2×8=16 diodes RGB adressables.

1213012129La grille TI-RGB Array est à connecter à ta calculatrice via l'interface TI-Innovator Hub et son port breadboard.

Une option disponible à ce jour uniquement pour les modèles ayant une gestion en Python du TI-Innovator Hub, soit les TI-Nspire CX II ainsi que les éditions Python des TI-83 Premium CE et TI-84 Plus CE.

Nous prendrons comme exemple l'image ci-contre faisant déjà 2×8 pixels.

Déjà quel format adopter pour l'image au sein du script Python ? Il nous faut tout d'abord voir les instructions dont on dispose.

Pour récupérer un objet dont les méthodes permettent de contrôler le TI-RGB Array, il te faut commencer par le code suivant :
Code: Select all
from ti_hub import * # uniquement TI-Nspire CX II
from rgb_arr import * # uniquement TI-83PCE/84+CE

rgbarr = rgb_array()

En pratique contrairement à la BBC micro:bit, le TI-Innovator Hub n'est pas directement pilotable en Python mais dans un langage de script propriétaire. Les différents appels aux bibliothèques Python fournies par TI sur la calculatrice convertissent en fait ce qu'on leur demande en instructions pour le langage de script du TI-Innovator Hub. Par exemple, le code précédent envoie en réalité au TI-Innovator Hub l'instruction CONNECT RGB.

L'objet Python ainsi récupéré offre alors les méthodes suivantes :
  • .set(diode, rouge, vert, bleu) : allume la diode indiquée (n°0 à 15) dans la couleur RGB précisée
  • .set_all(rouge, vert, bleu) : allume les 16 diodes dans la couleur précisée
  • .all_off() : éteint les 16 diodes
  • .pattern(masque) : allume en rouge les diodes correspondant au masque binaire indiqué
Comme nous l'avions vu dans l'article précédent, ici les instructions d'affichage transitent via le port USB de la calculatrice, ce qui génère un certain délai. Afin d'obtenir un affichage d'image aussi instantané que possible et donc pouvoir espérer faire jouer des animations aussi fluides que possible, il nous faut donc minimiser le nombre d'instructions utilisées.

Intéressons-nous donc à la méthode .pattern() qui permet d'allumer plusieurs diodes à la fois. Par exemple .pattern(42) envoie la commande SET RGB PATTERN 42. Comme 42=25+23+21, cela allumera en rouge 3 diodes : les n°1, 3 et 5.

Mais si nous n'avons que du rouge, nous n'irons pas loin... Et bien justement, la dernière mise à jour 1.5 du TI-Innovator Hub a rajouté un paramètre de couleur optionnel à l'instruction PATTERN, sous la forme SET RGB PATTERN masque rouge vert bleu. En fait les bibliothèques Python de TI ne le gèrent pas encore, mais il y a quand même une astuce pour en profiter malgré tout. En effet toutes les méthodes Python acceptent un paramètre supplémentaire non spécifié au menu : un suffixe qui sera concaténé à l'instruction envoyée. Pour envoyer par exemple un SET RGB PATTERN 42 255 0 255, il nous suffit d'appeler .pattern(42, "255 0 255"). ;)

Cette méthode .pattern() aurait pu nous être très utile pour minimiser le nombre d'instructions échangées, notamment dans le contexte d'images indexées : au lieu d'une instruction pour chacune des 16 diodes, nous aurions une seule instruction par couleur de la palette. Mais hélas, nous nous rendons vite compte qu'elle ne convient pas. En effet, elle allume bien maintenant le masque de diodes dans la couleur indiquée, mais elle éteint systématiquement toutes les autres diodes. L'affichage d'une image comportant plusieurs couleurs est donc strictement impossible. :'(


Donc tant pis. En attendant que Texas Instruments nous fournisse de meilleures instructions (ou pas), nous optons pour une boucle appelant la méthode .set() pour allumer au pire chacune des 16 diodes du TI-RGB Array.

Nous choisissons ici comme déjà expliqué de compacter les données Python de l'image sous la forme d'un tableau d'octets (type byte), mais pas de les compresser, le gain d'une compression RLE étant bien faible sur un aussi petit nombre de pixels, sauf à afficher des images ne présentant pas une grande complexité.

Quant au format de ces données, nous choisissons de chaîner des quadruplets d'octets :
  • numéro de diode
  • rouge
  • vert
  • bleu
Ce qui permet entre autres de gérer des images transparentes en ne rafraîchissant pas l'état des diodes non indiquées.

1393113932Et voilà, l'image que tu as choisie s'affiche alors sur le TI-RGB Array ! :bj:

Tu peux maintenant dessiner absolument tout ce que tu veux, de préférence en 2×8 pixels, et obtenir rapidement le script l'affichant sur ton TI-RGB Array ! :D

Tu restes libre bien sûr de fournir des images plus grandes, elles seront si besoin redimensionnées. Mais avec ici sur le TI-RGB Array des pixels peu nombreux et assez "gros", il vaut mieux pour toi garder le contrôle sur ce que ça donnera pixel par pixel, en fournissant une image au plus proche du format d'affichage.

Liens img2calc :

midi2calc: conversion musique → Python pour TI-Innovator Hub

New postby critor » 31 May 2021, 11:38

729872897757Le TI-Innovator Hub est un périphérique pour tes calculatrices TI-83 Premium CE, TI-84 Plus CE et TI-Nspire CX.

Il est même pilotable en Python sur les derniers modèles TI-Nspire CX II, ainsi que sur les éditions Python des TI-83 Premium CE et TI-84 Plus CE.

Entre bien d'autres choses, il rajoute à ta calculatrice la capacité à produire des sons, grâce à un élément situé dans la base de son boîtier.

1395013949Aujourd'hui est encore un grand jour sur TI-Planet ; nous te lançons midi2calc, un nouveau service en ligne entièrement gratuit permettant d'ouvrir les portes d'une toute nouvelle dimension à ta calculatrice. ;)

Comme son nom l'indique ce nouveau projet que nous t'avons développé avec amour est une nouvelle fois d'un convertisseur : tu lui donnes un fichier de partition de musique au format MIDI, et il te génère automatiquement un script Python permettant à ta calculatrice de jouer la musique en question sur le TI-Innovator Hub ! :D








1) La musique : de la vibration à la partition

Go to top

Mais commençons rapidement par expliquer tout cela. Au tout début, le son est une vibration mécanique. On appelle fréquence le nombre de vibrations par seconde, que l'on exprime en Hertz (symbole Hz). Les fréquences audibles par l'oreille humaine vont en gros de 20 Hz à 20000 Hz.

Bien évidemment, les limites de fréquences audibles varient d'une personne à une autre. Donc laissons de côté ces extrêmes, et prenons comme référence une vibration intermédiaire de 440 Hz. Et bien voilà donc notre première note de musique : le la3 en notation française, ou A4 en notation anglo-allemande.

Le numéro en suffixe indique l'octave. Un octave est un intervalle de fréquences
$mathjax$\left[f_1,f_2\right[$mathjax$
, où
$mathjax$f_2=2\times f_1$mathjax$
. Ce qui nous permet déjà d'encadrer notre note de référence en passant aux octaves supérieurs (plus aigus) ou inférieurs (plus graves) :
  • la8 ou A9 ou A8 : 14080 Hz
  • la7 ou A8 ou A7 : 7040 Hz
  • la6 ou A7 ou A6 : 3520 Hz
  • la5 ou A6 ou A5 : 1760 Hz
  • la4 ou A5 ou A4 : 880 Hz
  • la3 ou A4 ou A3 : 440 Hz
  • la2 ou A3 ou A2 : 220 Hz
  • la1 ou A2 ou A1 : 110 Hz
  • la-1 ou la0 ou A1 ou A0 : 55 Hz
  • la-2 ou la-1 ou A0 ou A-1 : 27,5 Hz
  • la-3 ou la-2 ou A-1 ou A-2 : 13,75 Hz
Comme tu vois, la numérotation des octaves, c'est compliqué... Il existe diverses numérotations différentes de par le monde. Ci-dessus tu as donc :
  • jusqu'à 2 versions de la numérotation latine :
    • l'historique, qui n'a pas d'octave de numéro 0, et passe donc directement de l'octave 1 à l'octave -1
    • et une où l'octave 0 a été rajouté par soucis de logique
  • la numérotation anglo-allemande
  • la numérotation de certains instruments compatibles avec la norme MIDI
Sans une connaissance pointue du contexte dans lequel il est énoncé, un numéro d'octave est donc hautement imprécis. Nous éviterons donc soigneusement de faire appel aux numéros d'octaves dans le code qui va suivre.

Séparons chaque octave en 12 sous-intervalles de même longueur que nous appellerons demi-tons. Pour cela nous avons besoin de 11 notes de musique, que voici :
  • en notation latine : Do, Do# ou Ré♭, , Ré# ou Mi♭, Mi, Fa, Fa# ou Sol♭, Sol, Sol# ou La♭, La, Si
  • en notation anglo-saxonne : C, C# ou D♭, D, D# ou E♭, E, F, F# ou G♭, G, G# ou A♭, A, B
  • en notation germanique : C, C# ou D♭, D, D# ou E♭, E, F, F# ou G♭, G, G# ou A♭, A, H
C'est la gamme chromatique. Le rapport entre les fréquences de 2 notes consécutives dans cette gamme est alors de
$mathjax$\sqrt[12]2$mathjax$
.




2) Codage MIDI d'une partition

Go to top

Maintenant que nous avons les bases, nous pouvons passer aux fichiers MIDI. Il s'agit d'une version informatisée d'une partition de musique. Elle comprend une ou plusieurs pistes de notes, à jouer chacune par un instrument.

Chaque piste comprend donc des notes à jouer. Chaque note à jouer est décrite par plusieurs caractéristiques, dont entre autres 2 qui vont nous intéresser ici :
  • sa hauteur, valeur qui détermine sa fréquence
  • sa durée
Le format MIDI code les hauteurs de notes sur 7 bits, ce qui autorise 27=128 notes différentes :
  • La note de numéro 0 est la plus grave : selon le contexte le do-3 ou do-2 ou C-1 ou C-2.
  • La note de numéro 69 est notre fameux la3 ou A4 ou A3.
  • La note de numéro 127 est la plus aiguë : selon le contexte le sol8 ou G9 ou G8.

Ayant récupéré le numéro n d'une note MIDI à jouer, il nous est donc très facile de calculer sa fréquence :
$mathjax$440\times {\sqrt[12]2}^{n-69}$mathjax$
.




3) De la partition à la mélodie, une affaire de choix

Go to top

Les fichiers MIDI ont donc été conçus pour gérer plusieurs instruments, et comportent pour cela plusieurs pistes. Il ne sera donc pas rare de rencontrer plusieurs notes devant être jouées en même temps.
Or problème ici, nous contrôlons le TI-Innovator Hub qui ne peut se comporter que comme 1 seul instrument. Il lui est ainsi impossible de jouer plusieurs notes à la fois.

Nous t'avons justement conçu sur-mesures une interface permettant de résoudre facilement cette difficulté.

Lorsque tu auras fourni ton fichier MIDI ses différentes pistes seront listées, chacune avec sa description ainsi que son nombre de notes.

Il te suffit alors de désactiver les pistes correspondant aux instruments d'accompagnement, et de ne garder que la ou les pistes des instruments principaux. :)

Mais comment donc distinguer les pistes principales ? Une difficulté est qu'il n'y a pas de règle absolue :
  • Tu peux regarder les descriptions des pistes : le caractère principal ou accompagnant de la piste sera parfois indiqué, mais pas toujours.
  • Tu peux regarder l'ordre des pistes : la ou les pistes principales seront parfois les premières ou les dernières, mais encore une fois pas systématiquement.
  • Tu peux regarder le nombre de notes des pistes : un nombre nettement supérieur à ceux des autres pistes peut être un indice, mais il n'est absolument pas infaillible.

Mais justement, ça aussi nous l'avons prévu. Tu trouveras sous la liste des pistes un bouton de lecture, qui permet de jouer directement dans ton navigateur ta sélection actuelle de pistes, et ce avec un seul instrument histoire de te donner un aperçu aussi fiable que possible de ce que cela donnera une fois passé sur ta calculatrice.

Tu peux donc immédiatement savoir à l'oreille si tu as coché les bonnes pistes ou pas ! :bj:

Tu restes bien sûr libre de conserver plusieurs pistes, et tester l'effet que ça donne. Puisque le cas n'est donc pas à exclure il nous faut faire un choix : en cas de notes devant être jouées en même temps, nous ne conserverons que la plus aiguë sur l'intervalle de temps concerné.

Si les cas où sur un intervalle de temps une note de piste d'accompagnement est plus aiguë qu'une note de piste principale sont rares, cela pourra donner un bon effet, plus de richesse à ta mélodie.

Notons que si tu disposes de plusieurs TI-Innovator Hub, tu peux convertir les pistes séparément et tenter de les jouer simultanément. Nous n'avons toutefois pas testé si cette superposition sonore d'instruments identiques était très harmonieuse.




4) Notre codage Python d'une mélodie

Go to top

Nous souhaitons te permettre de stocker et jouer de longues mélodies Python sur ta calculatrice, et ainsi organiser de véritables concerts pour tes jeux ou projets Python.

Il nous faut minimiser la consommation de mémoire heap. Comme déjà expliqué, nous te proposons un format de données compacté sous forme de tableau d'octets (type bytes). Une note sera codée sur 2 octets :
  • 1 octet avec les bits 0 à 6 (7 bits donc) pour indiquer le numéro de note, et le bit 7 pour indiquer un silence
  • 1 octet pour indiquer la durée




5) Fonctions Python disponibles pour jouer du son sur TI-Innovator Hub

Go to top

Nous en arrivons donc enfin à la question du TI-Innovator Hub. Comment lui faire jouer un son ?

Importons déjà le module nécessaire, directement intégré sur nos calculatrices :
Code: Select all
import sound #sur TI-83PCE/84+CE
from ti_hub import sound #sur TI-Nspire CX II


2 méthodes sont alors offertes pour jouer un son :
  • .tone(fréquence, temps), avec la fréquence qui peut aller de 0 à 8000 Hz, et le temps de 0.1 à 100s
  • .note(note, temps) très similaire, où l'on précise juste la note au lieu de la fréquence

Par exemple pour jouer notre la3 ou A4, on peut appeler au choix :
  • sound.tone(440, 1)
  • sound.note("A4", 1)
Nous allons ici utiliser sound.tone() pour plusieurs raisons :
  • le calcul de la fréquence pour sound.tone() est simple et rapide comme vu plus haut, alors que pour sound.note() il faudrait calculer à la fois la note et l'octave
  • pour éviter toute confusion, nous souhaitons éviter l'utilisation du moindre numéro d'octave
  • sound.note() ne joue que des fréquences correspondant à des notes de la gamme, alors que sound.tone() offre bien davantage de libertés pour de futures évolutions
  • avec sound.note() nous n'avons pas trouvé de notation permettant de jouer les notes altérées par un dièse ou bémol, et 5 des 12 notes de la gamme chromatique nous sont donc inaccessibles, ton oreille risquerait de ne pas apprécier les conversions de certains morceaux...
  • sound.note() ne comprend de plus qu'un intervalle de notes restreint allant du C3 au A7 soit seulement 35 notes, très insuffisant pour reproduire fidèlement les 128 notes MIDI
Notons que le TI-Innovator Hub n'est pas très harmonieux dans les fréquences extrêmement graves ou aiguës.
Mais ça aussi nous te l'avons prévu sur l'interface. :D

Une fois ta sélection de pistes effectuée, l'intervalle de notes utilisées t'est indiqué en numérotation MIDI. Tu peux alors décaler tout le morceau de musique vers le haut ou vers le bas d'autant de demi-tons que tu voudras.




6) Notre fonction Python pour jouer une mélodie

Go to top

Et voilà donc notre fonction jouant la musique, ici dans sa version TI-83 Premium CE et TI-84 Plus CE : :D
Code: Select all
#the melody playing function
#- mus : melody data
#- durat_bytes : number of bytes encoding each note duration
def play_melody_on_innovator(mus, durat_bytes):
  r = 2 ** (1 / 12)
  t2, durat, i = monotonic(), 0, 0
  t1 = t2
  while i < len(mus):
    t1, t2 = t2, monotonic()
    deltat = max(0, (t2 - t1) / 1000 - durat)
    note = mus[i]
    i += note < 0x80
    durat = mus[i] & ((note ^ 0x80) | 0x7F)
    i += 1
    if durat_bytes > 1:
      durat |= int.from_bytes(mus[i:i + durat_bytes - 1],'little') << (8 - (note >= 0x80))
      i += durat_bytes - 1
    durat = max(1, durat) / 10
    sound.tone((note < 0x80) and 440 * r**(note - 69), durat)
    sleep(max(0, durat - deltat))

Chaque appel sound.tone(note, durée) est ici suivi d'un appel time.sleep(durée) afin d'attendre avant de jouer la note suivante.

Toutefois pour enchaîner correctement les notes de musique et tenir le rythme, il nous faut tenir compte du temps de latence dû au fait que l'appel sound.tone() est ici converti en une commande envoyée au TI-Innovator Hub par le port USB de la calculatrice, ainsi que du temps d'exécution que nécessite tout le reste du corps de la boucle.

Et bien c'est prévu, la méthode time.monotonic() ou time.ticks_ms() est utilisée pour mesurer la durée d'exécution d'une itération, prise en compte pour corriger l'appel time.sleep() de l'itération suivante. :D

Une fois ta conversion validée, tu obtiens ton script Python converti sous deux formes différentes :
  • un fichier .py téléchargeable
  • un code en coloration syntaxique que tu peux directement sélectionner et copier-coller




7) Exemples de mélodies

Go to top

Voyons tout-de-suite ce que ça donne. Pour fêter cet événement exceptionnel, commençons par un clin d'œil à nos amis nord-américains : ;)


Et nous t'avions promis de quoi jouer des mélodies ambitieuses pour tes jeux ou projets, voici de quoi te convaincre que l'objectif est atteint et que ça tient bien le rythme. Voici l'air de la chevauchée des Walkyries par Richard Wagner, 1856 : :#tritop#:




8) Liens d'accès

Go to top

midi2calc est un service en ligne entièrement gratuit, ne nécessitant de plus aucune inscription. :D

Pour accéder à midi2calc dès maintenant, c'est très simple. Tu as 2 liens directs courts :
  • https://tiplanet.org/midi2calc pour lancer l'outil de façon intégrée à l'interface de TI-Planet, soit entre autres avec le chat sous la main pour demander de l'aide ou faire des suggestions :)
  • https://tiplanet.org/midi2calc_classe dédié à un usage pédagogique en classe. Les divers éléments de TI-Planet (chat d'entraide, etc.) ne sont ici pas affichés, ne générant donc aucun bruit ou distraction lors de ta présentation.
En retour, nous aurons grand plaisir à prendre connaissance de tes projets. ;)

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
699 utilisateurs:
>650 invités
>41 membres
>8 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)