Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
projets:brutbox:dev:accueil [2016/04/04 14:19] resonance [Logiciel] |
projets:brutbox:dev:accueil [2019/08/01 21:56] (Version actuelle) resonance [Dev] |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
* Nom : BrutBox | * Nom : BrutBox | ||
- | * État de l'art : [[http:// | + | * État de l'art : [[http:// |
* Entrées : kinect, accéleromètre sans fil, neurosky (sans routage), capteur distance, piezo pince, micro, crayon graphite, conductivité corps (genre makey makey), webcam (face tracking, fiducials, ...), gros boutons, pavé XY façon kaospad, tapis XY | * Entrées : kinect, accéleromètre sans fil, neurosky (sans routage), capteur distance, piezo pince, micro, crayon graphite, conductivité corps (genre makey makey), webcam (face tracking, fiducials, ...), gros boutons, pavé XY façon kaospad, tapis XY | ||
* Minimiser le champs d’intervention à un seul capteur. Possibilités de séries de capteurs identiques (ex: | * Minimiser le champs d’intervention à un seul capteur. Possibilités de séries de capteurs identiques (ex: | ||
Ligne 11: | Ligne 11: | ||
* Sorties : VST, sortie Midi (vers synthétiseur), | * Sorties : VST, sortie Midi (vers synthétiseur), | ||
* Production : Armada | * Production : Armada | ||
+ | |||
+ | |||
+ | ===== Dev ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[projets: | ||
+ | * [[.: | ||
+ | * [[projets: | ||
+ | * Dev version wirless - OSC : https:// | ||
+ | (prevoir 10/15 minute de decoupe par cube (voir 45minutes sur mauvaise laser.. )+ temps assemblage assez long ... et 10€ de matos par boite) | ||
+ | |||
+ | |||
+ | |||
==== État de l'art ==== | ==== État de l'art ==== | ||
Ligne 32: | Ligne 45: | ||
- | ===== Prototypes ===== | ||
- | ==== Prototype 0.1 - 03/2015==== | + | ===== Logiciel ===== |
- | * [[.: | + | |
- | * [[.: | + | |
- | ==== Prototype 0.2 ==== | + | ==== PARTHENAY - OCTOBRE 2016 ==== |
- | **juin 2015 au LFO** : http:// | + | Résidence de développement |
- | * Sélection élargie | + | == version |
- | * Design des capteurs plus gros, plus lourds, codes couleurs pour faciliter la compréhension et le maniement | + | {{: |
- | * Câblages plus longs pour s' | + | |
- | * Patchs | + | |
- | {{.:scenebrutbox.jpg|}} | + | {{:projets: |
- | ==== Prototype v1 ==== | ||
- | * Pad de travail : http:// | ||
- | ----- | + | **POINTS ABORDÉS :**\\ |
+ | Recherche de simplification du logiciel pour des personnels encadrants ne pratiquant pas ou peu l' | ||
+ | * Création d'une collection d' | ||
+ | * Simplification des entrées audio présnetes par défaut sur les patchs vierges (bb-micro-in.pd) | ||
+ | * Simplification des sorties audio (bb-audio-out-simple.pd) | ||
+ | * Renforcer la distinction entre instruments à simple déclenchement (bouton action unique) et instruments à variations (progressif); | ||
+ | * Simplification de l' | ||
+ | {{: | ||
+ | == COLLECTION DÉBUTANT == | ||
+ | **INSTRUMENTS (noms et système de typage à définir)**\\ | ||
- | ===== Boites ===== | + | **à action simples** |
- | Découpe de boîtes en bois contre-plaqué de 3mm avec une machine | + | * synth-batterie (**a faire**) |
+ | * synth-bouton | ||
+ | * synth-percussion | ||
+ | **à variations** | ||
+ | * synth-mono | ||
+ | * synth-organ | ||
+ | * synth-sirene | ||
+ | * synth-mouche | ||
- | < | + | **EFFECTS |
- | Attention certains fichiers ont des problèmes d' | + | * delay |
- | </ | + | * flanger |
+ | * pitch | ||
- | * {{.: | ||
- | * {{.: | ||
- | |||
- | Nous avons utilisé un générateur de boite : http:// | ||
- | |||
- | |||
- | ===== Logiciel ===== | ||
+ | ==== GANTNER - FEVRIER 2016 ==== | ||
{{.: | {{.: | ||
- | **Dernière version : fevrier 2016** | + | (résidence à l' |
Nouveautés : | Nouveautés : | ||
Ligne 87: | Ligne 104: | ||
===== Électronique ===== | ===== Électronique ===== | ||
- | ==== Carte électronique | + | ==== Version sans fil - oSC ==== |
- | Nous utilisons pour le moment, la carte Teensy 2.0 qui permet de convertir en MIDI les données de nos capteurs. | + | https:// |
- | En guise de connectique nous avons opté pour des connecteurs USB (pour éviter les faux contacts). | + | |
- | **Gravure | + | **Décembre 2018 :** Par 3615 senor , basé sur ESP 8266 , batterie lipo , routeur wifi xiaomi, chargeur |
- | On fait de la gravure a l' | + | |
- | | + | **notice utilisation** |
- | | + | * bb sans fil envoie vers 10.0.0.2 malinette |
+ | * le routeur fixe l' | ||
+ | * eric renvoie ensuite directe de pd vers d' | ||
+ | |||
+ | ==== Capteurs ==== | ||
+ | |||
+ | * Externe | ||
+ | | ||
+ | | ||
+ | * infrarouge 20/150cm : 1 ana | ||
+ | * Piezo (plaque) : 1 ana | ||
+ | * Pression carré (plaque) | ||
+ | * Micro electret : 1 ana | ||
+ | * Gros bouton (~buzzer) : 1 ana | ||
+ | * Module Joystick : 2 ana (prise dédiée) | ||
+ | * Accéléromètre ou gyroscope ? : 2 ana (prise dédiée) | ||
+ | * Touch : MPR121 **prises dédiées SCL/ | ||
+ | * Encodeur potentiomètre (+ robinet ?) : **prises dédiées " | ||
+ | |||
+ | |||
+ | ==== MindWave ==== | ||
+ | Nous utilisons un casque Mindwave neurosky pour capter les donnéees (médiation et concentration) d'un utilisateur. | ||
+ | Nous utilisons **Processing** qui envoie les données en OSC à PureData (les bibliothèques oscP5 et MindsetProcessing sont nécessaires). | ||
+ | |||
+ | |||
+ | ++++ Le code pour processing | ||
+ | |||
+ | <code java> | ||
+ | import oscP5.*; | ||
+ | import netP5.*; | ||
+ | import processing.serial.*; | ||
+ | import pt.citar.diablu.processing.mindset.*; | ||
+ | |||
+ | boolean SEND_OSC = true; | ||
+ | String OSC_ADDRESS = " | ||
+ | int OSC_PORT = 54321; | ||
+ | String SERIAL_PORT = "/ | ||
+ | |||
+ | OscP5 oscP5; | ||
+ | NetAddress myRemoteLocation; | ||
+ | MindSet mindSet; | ||
+ | |||
+ | void setup() { | ||
+ | frameRate(20); | ||
+ | oscP5 = new OscP5(this, 12345); | ||
+ | myRemoteLocation = new NetAddress(OSC_ADDRESS, | ||
+ | mindSet = new MindSet(this, | ||
+ | } | ||
+ | |||
+ | void draw() { | ||
+ | } | ||
+ | |||
+ | void exit() { | ||
+ | | ||
+ | mindSet.quit(); | ||
+ | super.exit(); | ||
+ | } | ||
+ | |||
+ | public void attentionEvent(int attentionLevel) { | ||
+ | OscMessage myMessage = new OscMessage("/ | ||
+ | myMessage.add(attentionLevel); | ||
+ | oscP5.send(myMessage, | ||
+ | } | ||
+ | |||
+ | public void meditationEvent(int meditationLevel) { | ||
+ | OscMessage myMessage = new OscMessage("/ | ||
+ | myMessage.add(meditationLevel); | ||
+ | oscP5.send(myMessage, | ||
+ | } | ||
+ | |||
+ | public void eegEvent(int delta, int theta, int low_alpha, int high_alpha, int low_beta, int high_beta, int low_gamma, int mid_gamma) { | ||
+ | OscMessage myMessage = new OscMessage("/ | ||
+ | myMessage.add(delta); | ||
+ | myMessage.add(theta); | ||
+ | myMessage.add(low_alpha); | ||
+ | myMessage.add(high_alpha); | ||
+ | myMessage.add(low_beta); | ||
+ | myMessage.add(high_beta); | ||
+ | myMessage.add(low_gamma); | ||
+ | myMessage.add(mid_gamma); | ||
+ | oscP5.send(myMessage, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | ==== Wiimote ==== | ||
+ | Une piste d' | ||
+ | En démontant le nunchuk et en retirant le joystick nous pouvons utiliser deux entrées analogiques. | ||
+ | Attention la wiimote est alimenté en 3.3v, donc nous sommes limité aux capteurs resistifs qui fonctionnent à cette tension. | ||
+ | |||
+ | On utilise ensuite OSCULATOR (sur macOS) pour recevoir les données et les transformer en midi. [[materiel:wiimote: | ||
+ | |||
+ | {{ .:nunchuck_hack.jpg? | ||
+ | {{ .:screen_shot_06-03-15_at_01.21_pm.png? | ||
+ | |||
+ | |||
+ | ==== Carte électronique ==== | ||
+ | Nous utilisons pour le moment, la carte Teensy 2.0 qui permet de convertir en MIDI les données de nos capteurs. | ||
+ | En guise de connectique nous avons opté pour des connecteurs USB (pour éviter les faux contacts).\\ | ||
+ | === VERSION 1 === | ||
+ | [[projets: | ||
+ | === VERSION 2 === | ||
+ | [[projets: | ||
- | {{ .: | ||
- | {{.: | ||
- | {{.: | ||
+ | == Fournisseurs discounts (connecteurs et cables usb)== | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | ===== Firmware Teensy ===== | ||
- | ==== Firmware Teensy actuel (Make it brut / Fevrier | + | ==== Février |
+ | Après de nombreux autres test plus complexe on est revenu au plus simple et basique : | ||
++++ teensy-8-in.ino | | ++++ teensy-8-in.ino | | ||
<code cpp> | <code cpp> | ||
Ligne 197: | Ligne 318: | ||
==== Olds Firmwares Teensy 2 ==== | ==== Olds Firmwares Teensy 2 ==== | ||
Réception des données MIDI à partir de Pure Data | Réception des données MIDI à partir de Pure Data | ||
- | {{.: | + | {{: |
Envoie en 10 bits et réception avec pd avec la boite [<< 7] : | Envoie en 10 bits et réception avec pd avec la boite [<< 7] : | ||
Ligne 803: | Ligne 924: | ||
</ | </ | ||
++++ | ++++ | ||
- | ==== Capteurs ==== | ||
- | * Externe : Joystick Thrustmaster® | ||
- | * Externe : Wiimote® (mac) >> Voir la page ressource [[materiel: | ||
- | * Infrarouge 3/30cm : 1 ana | ||
- | * infrarouge 20/150cm : 1 ana | ||
- | * Piezo (plaque) : 1 ana | ||
- | * Pression carré (plaque) : 1 ana | ||
- | * Micro electret : 1 ana | ||
- | * Gros bouton (~buzzer) : 1 ana | ||
- | * Module Joystick : 2 ana (prise dédiée) | ||
- | * Accéléromètre ou gyroscope ? : 2 ana (prise dédiée) | ||
- | * Touch : MPR121 **prises dédiées SCL/SDA - entrées digitales 5 & 6 D0/ | ||
- | * Encodeur potentiomètre (+ robinet ?) : **prises dédiées " | ||
- | ==== MindWave ==== | ||
- | Nous utilisons un casque Mindwave neurosky pour capter les donnéees (médiation et concentration) d'un utilisateur. | ||
- | Nous utilisons **Processing** qui envoie les données en OSC à PureData (les bibliothèques oscP5 et MindsetProcessing sont nécessaires). | ||
+ | === Avec Encoder === | ||
+ | * Ajouter la bibliothèque : http:// | ||
- | ++++ Le code pour processing | + | {{.: |
- | <code java> | + | === Avec capacitif MPR121 === |
- | import oscP5.*; | + | * Module MPR121 : https://www.adafruit.com/ |
- | import netP5.*; | + | |
- | import processing.serial.*; | + | |
- | import pt.citar.diablu.processing.mindset.*; | + | |
- | boolean SEND_OSC = true; | + | {{.:mpr121.png?200|}} |
- | String OSC_ADDRESS = "127.0.0.1"; | + | |
- | int OSC_PORT = 54321; | + | |
- | String SERIAL_PORT = "/ | + | |
- | OscP5 oscP5; | ||
- | NetAddress myRemoteLocation; | ||
- | MindSet mindSet; | ||
- | void setup() { | + | === Teensy for BrutBox |
- | frameRate(20); | + | * Fichiers : {{.: |
- | oscP5 = new OscP5(this, 12345); | + | * Midi : https:// |
- | myRemoteLocation | + | |
- | mindSet | + | |
- | } | + | |
- | void draw() { | + | **Avec Pure Data** : |
- | } | + | {{.: |
- | void exit() { | + | **Avec Arduino** : |
- | //println(" | + | ++++ teensy_brutbox_2.ino | |
- | | + | <code cpp> |
- | super.exit(); | + | // TEENSY 2 - BRUTBOX |
- | } | + | // Control inputs |
+ | // 08/06/2015 - http:// | ||
- | public void attentionEvent(int attentionLevel) { | + | #include < |
- | | + | # |
- | | + | #include <Encoder.h> |
- | oscP5.send(myMessage, | + | |
- | } | + | |
- | public void meditationEvent(int meditationLevel) { | + | // Capacitive apacitive MPR121 |
- | | + | // Connection Teensy2 |
- | | + | // USB wiring : d+ : SDA, d- : SCL, SCL = DO, SDA = D1 |
- | | + | Adafruit_MPR121 cap = Adafruit_MPR121(); |
- | } | + | const int touchNb |
+ | const int touchThreshold = 60; | ||
+ | int touchStateCtl[] = {40, 41, 42} ; // touch on/off | ||
+ | int touchState[touchNb]; | ||
+ | int currentTouchValues[touchNb]; | ||
+ | int lastTouchValues[touchNb]; | ||
+ | int touchCtl[] = {60, | ||
+ | int touchOn = 0; | ||
- | public void eegEvent(int delta, int theta, int low_alpha, int high_alpha, int low_beta, int high_beta, int low_gamma, int mid_gamma) | + | |
- | | + | // Analog setup |
- | myMessage.add(delta); | + | int anaPins[] = {22,11,12,13,14,15,16,17, |
- | | + | const int anaNb = 12; // number of inputs |
- | | + | int anaCtl[] = {11, |
- | | + | int anaStateCtl[] |
- | | + | int anaState[anaNb]; // state : on/off |
- | | + | int anaValues[anaNb]; // current analog values |
- | | + | int anaLastValues[anaNb]; // previous analog values |
- | | + | |
- | oscP5.send(myMessage, myRemoteLocation); | + | |
+ | // Encoder setup | ||
+ | Encoder encoderSensor | ||
+ | long encoderOldPosition | ||
+ | long encoderNewPosition; | ||
+ | int encoderStateCtl = 13; // receive ctlout 13 | ||
+ | int encoderOn = 0; | ||
+ | |||
+ | const int channel = 1; | ||
+ | |||
+ | // Sampling rate | ||
+ | const long interval = 30; | ||
+ | unsigned long currentMillis; | ||
+ | unsigned long previousMillis = 0; | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // Midi receive : on/off sensors | ||
+ | usbMIDI.setHandleControlChange(OnControlChange); | ||
} | } | ||
- | </ | ||
+ | void loop() { | ||
+ | currentMillis = millis(); | ||
+ | if(currentMillis - previousMillis >= interval) { | ||
+ | previousMillis = currentMillis; | ||
+ | |||
+ | // Analog sensors loop | ||
+ | for (int i = 0; i < anaNb; i++) { | ||
+ | if(anaState[i] == 1) { // check first if the sensor is on | ||
+ | anaValues[i] = (int) analogRead(anaPins[i]) | ||
+ | Serial.println(anaValues[i]); | ||
+ | if (anaValues[i] != anaLastValues[i]) { | ||
+ | usbMIDI.sendControlChange(anaCtl[i], | ||
+ | anaLastValues[i] = anaValues[i]; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Capacitive loop | ||
+ | | ||
+ | if(touchOn == 1){ | ||
+ | for (uint8_t i=0; i < touchNb; i++) { | ||
+ | | ||
+ | currentTouchValues[i] = cap.filteredData(i); | ||
+ | if ((currentTouchValues[i] - lastTouchValues[i]) < -touchThreshold) { | ||
+ | usbMIDI.sendNoteOn(touchCtl[i], | ||
+ | } | ||
+ | if ((currentTouchValues[i] - lastTouchValues[i]) > touchThreshold) { | ||
+ | usbMIDI.sendNoteOn(touchCtl[i], | ||
+ | } | ||
+ | lastTouchValues[i] = currentTouchValues[i]; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | // Encoder | ||
+ | if (encoderOn == 1) { | ||
+ | | ||
+ | if (encoderNewPosition != encoderOldPosition) { | ||
+ | encoderOldPosition = encoderNewPosition; | ||
+ | usbMIDI.sendControlChange(12, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // Discard incoming MIDI messages. | ||
+ | while (usbMIDI.read()) {} | ||
+ | } | ||
+ | |||
+ | // Receive Midi Control Change | ||
+ | void OnControlChange(byte channel, byte control, byte value) { | ||
+ | // Analog sensors on/off | ||
+ | if (control == anaStateCtl[0]) {anaState[-value+(anaNb-1)] = 0;} | ||
+ | else if (control == anaStateCtl[1]) {anaState[-value+(anaNb-1)] = 1;} | ||
+ | else if (control == touchStateCtl[0]) {touchState[value] = 0;} | ||
+ | else if (control == touchStateCtl[1]) {touchState[value] = 1;} | ||
+ | else if (control == touchStateCtl[2]) { | ||
+ | | ||
+ | if (touchOn == 1) { | ||
+ | | ||
+ | for (uint8_t i=0; i<4; i++) {lastTouchValues[i] = cap.filteredData(i); | ||
+ | } | ||
+ | } | ||
+ | else if (control == encoderStateCtl) {encoderOn = value;} | ||
+ | } | ||
+ | </ | ||
++++ | ++++ | ||
- | ==== Wiimote ==== | ||
- | Une piste d' | ||
- | En démontant le nunchuk et en retirant le joystick nous pouvons utiliser deux entrées analogiques. | ||
- | Attention la wiimote est alimenté en 3.3v, donc nous sommes limité aux capteurs resistifs qui fonctionnent à cette tension. | ||
- | On utilise ensuite OSCULATOR | + | ===== Prototypes ===== |
+ | |||
+ | ==== Prototype 0.1 - 03/ | ||
+ | * [[.: | ||
+ | * [[.: | ||
+ | |||
+ | ==== Prototype 0.2 ==== | ||
+ | **juin 2015 au LFO** : http:// | ||
+ | * Sélection élargie de capteurs | ||
+ | * Design des capteurs plus gros, plus lourds, codes couleurs | ||
+ | * Câblages plus longs pour s' | ||
+ | * Patchs | ||
+ | |||
+ | {{.:scenebrutbox.jpg|}} | ||
+ | |||
+ | ==== Prototype v1 ==== | ||
+ | * Pad de travail | ||
+ | |||
+ | |||
+ | ==== Prototype raspberry-pi ==== | ||
+ | * kit raspberry pi 3 + sd card + alimentation + keyboard (option) | ||
+ | * touch screen 7" 800x480 | ||
+ | * carte son (si besoin entrée micro...) = entre 3 et 35€ | ||
+ | * Mcp3008 = 4€ | ||
+ | * capteurs brutbox. | ||
+ | |||
+ | ----- | ||
+ | |||
+ | ----- | ||
+ | |||
+ | ===== Boites ===== | ||
+ | Découpe de boîtes en bois contre-plaqué de 3mm avec une machine à découpe laser. | ||
+ | |||
+ | < | ||
+ | Attention certains fichiers ont des problèmes d' | ||
+ | </ | ||
+ | |||
+ | * {{.: | ||
+ | * {{.: | ||
+ | |||
+ | Nous avons utilisé un générateur de boite : http:// | ||
+ | |||
- | {{ .: | ||
- | {{ .: | ||