=====JaDa Totem=====
[[http://git.jack.tf/Kush/TotemDance|Sources git]]
{{ :totem:alicelatortue.jpg?200|}}
Le JaDa Totem du Jack/Datapaulette, est une installation réalisée pour l'exposition "Totem" au Jardin d'Alice, ayant eu lieu en novembre 2016.
Cette installation invite les participants à danser sur un tapis [[wp>fr:Dance Dance Revolution|Dance Dance Revolution]] (Mayflash TX 6000). L'installation révèle ainsi l'image d'un totem sur un 5 écrans disposés verticalement, puis enfin choisit un animal totem en fonction de la performance de danse. Une musique en crescendo accompagne le danseur.
==== L'idée ====
{{ ::totem:totemproject.jpg?500|}}
Au Jack il existe bien des choses laissées à l'abandon, comme ce tapis DDR qui a tout de suite inspiré à créer une installation interactive dansante. Avec le thème "Totem" nous avons eu envie de proposer au visiteur d'invoquer son animal totem, par une danse chamanique, transcendante, accompagnée d'une musique percussive.
Disposer les écrans à la verticale semblait venir naturellement pour garder le lien avec le totem.
Puis donner un look naturel, en mettant des plantes autour pour donner une petite touche "lieu sacré" issu d'une forêt amérindienne et tenter de marier nature et technologie en même temps.
{{:totem:totemweb.jpg?150 |}}
==== Le totem ====
Cinq écrans sont disposés de manière verticale, soutenus par un pilier en bois crée spécialement pour l'occasion. Les écrans sont peints à la bombe pour dissimuler les boutons/marques et aussi pour mieux les fondre dans la végétation. Les écrans sont branchés sur la même machine via 2 cartes graphiques (modèles différents).
Quand les gens dansent, les écrans affichent progressivement un arbre humanoïde.
==== Le tapis DDR ====
{{ :totem:empeintestapisddr.jpg?200|}}
C'est un "Mayflash TX 6000" récupéré qui servait de tapis DDR pour la maison. La sortie en port série a été rétro-ingénieurée par le jack et est maintenant reconnue comme clavier grâce à un Arduino micro disposant de l'USB.
Le tapis est recouvert de contreplaqué gravé à la découpeuse laser figurant des empreintes de pas d'animaux, lui même recouvert d'une couche de plexiglass pour rendre le tapis facile à nettoyer.
==== L'ASCII L'Ojibwé Art ====
Pour mettre un peu en valeur le côté mystique de l'installation, les images sont affichées sur l'écran avec un effet [[wp>fr:ASCII Art|ASCII Art]] animé au rythme de la musique. Ce ne sont pas les caractères habituels de l'ASCII qui sont utilisés mais l'alphabet [[http://www.omniglot.com/writing/ojibwa.htm|Ojibwé]], la langue d'où vient le mot "totem". L'effet est réalisé grâce à un shader glsl, prenant en entrée l'image du totem arbre humanoïde et une texture d'alphabet Ojibwé, dont les caractères sont sélectionnés en fonction de la luminosité.
{{ :totem:ascii_ojbwebig.jpg?500 |}}
==== Les animaux ====
Les animaux ont été sélectionnés arbitrairement, en choisissant prioritairement des animaux d’Amérique du nord. Pour le choix final de l'animal nous avons du assigner un numéro à chaque animal.
{{ :totem:totem:all_animalssmall.jpg?400|}}
Voici la liste :
- Bison (bourrin)
- Puma
- Cheval (tagada=3)
- Loup
- Serpent (ssssinq,Nbre membres impair?)
- Tortue
- Vautour
- Pieuvre (8 tentacules)
- Hibou
- Castor
- Aigle
- Bélier
- Lièvre
==== Le choix de l'animal Totem ====
Le programme sélectionnait d'abord les animaux aléatoirement. Puis nous avons ensuite tenté de codifier les pas de danse et en définir une signature rythmique.
À chaque nouveau temps, le programme parcours les 16 derniers temps enregistrés et compare si la case du tapis DDR actuelle a déjà été appuyée. Si le pas actuel a déjà été appuyé il y a 3 temps et 7 temps, alors le programme rajoute un point pour l'animal n°3 et l'animal n°7.
Au final, le programme affiche l'animal ayant eu le meilleur score.
Exemple :
Y étant la case actuellement appuyée
FHTHFGRYRYTHGFTH étant les 16 dernières cases appuyées, celles de gauche étant la plus récente
_______^_^______
Le programme rajoute un point pour les animaux 8 et 10.
Grossièrement on peut dire simplement que si le danseur fait en majorité des motifs de n temps, il aura l'animal n.
fréquenceIntervalles : Liste[16]
dernierPasExecuté : Liste[16]
//fonction appelée à chaque nouveau temps de la musique
fonction NouveauTemps(numéroTempsActuel : entier, caseTapisDDRAppuyé : char)
{
Pour i de 1 jusqu'à 16
{
si dernierPasExecuté[(numéroTempsActuel-i)%16] égal caseTapisDDRAppuyé
alors fréquenceIntervalles[i-1] += 1
}
dernierPasExecuté[numéroTempsActuel%16] = caseTapisDDRAppuyé
}
//fonction appelée pour choisir l'animal à la fin.
fonction entier ChoixAnimal()
{
animal : entier = 0
Pour i de 0 jusqu'à 15
{
si fréquenceIntervalles[i] >= fréquenceIntervalles[animal]
alors animal = i
}
//il n'y a que 13 animaux, alors nous utilisons un modulo pour faire boucler la valeur de 0 à 12.
retourne animal%13
}
==== La musique ====
La musique est réalisée par un patch Pure Data (pd-l2ork). Il comprend un séquenceur jouant des sons préenregistrés, différentes compositions s'accumulent au fur et à mesure que le joueur danse.
Le patch pure data est synchronisé avec le programme openframeworks via OSC. Il lui envoie les temps, le tempo, si le joueur appuie ou non sur une case du tapis, la précision avec laquelle il a appuyé, et l'avancement général du joueur.
==== Matériel ====
* 5 écrans 15" 4/3
* Tapis DDR Mayflash TX 6000
* Clone Arduino pro micro (avec atmega32u4)
* Contreplaqué
* Plexiglass
* mac-plus
* corbeau empaillé
* Lierre/écorce/mousse végétale
==== Code Arduino ====
/*
DDR to keyboard
*/
#include "Keyboard.h"
#define DDR_UP 116 // t, up, 6
#define DDR_RT 104 // h, right, 5
#define DDR_DN 103 // g, down, 4
#define DDR_LT 102 // f, left, 3
#define DDR_BK 114 // r, upper left, 1
#define DDR_NT 121 // y, upper right, 2
const char tab[7] = {'o', 'r', 'y', 'f', 'g', 'h', 't'}; // configured keys in software
const int buttonPin[7] = {2, 3, 4, 5, 6, 7, 8}; // input pins
int buttonState[7], previousButtonState[7];
void setup() {
for (int i = 0; i <= 6; i++)
{
pinMode(buttonPin[i], INPUT_PULLUP);
buttonState[i] = previousButtonState[i] = LOW;
}
// initialize control over the keyboard:
Keyboard.begin();
}
void loop() {
// read the buttons :
for (int i = 0; i <= 6; i++)
{
buttonState[i] = digitalRead(buttonPin[i]);
if ( buttonState[i] != previousButtonState[i])
{
// save the current button state for comparison next time:
previousButtonState[i] = buttonState[i];
if( buttonState[i] == LOW) Keyboard.print(tab[i]);
}
} delay(1);
}
==== Software ====
* Openframeworks (linux)
* Puredata Pd-L2Ork
* Xorg