Sonorisation sans fil

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Principe

Matériel

Réception et traitement du signal OSC:

Alimentation :

Sono :

Installation

Configurer le WiFi comme ceci :

http://wiki.labomedia.org/index.php/Emission_radio_avec_une_Raspberry_Pi#Connecter_le_WiFi_au_r.C3.A9seau_local

Configurer du système audio : Il faut modifier les fichier de configuration audio :

sudo nano /etc/modprobe.d/alsa-base.conf

Il faut modifier la ligne suivante :

options snd-usb-audio index=-2

Il faut modifier la valeur de l'index de -2 à 0 comme ceci :

options snd-usb-audio index=0

Sauvegardez Ctrl + o et quittez Ctrl + x Vous pouvez tester avec :

speaker-test -c2 -D hw:0,0

On peut régler les volumes

alsamixer

Vous pouvez augmenter les volumes avec les différentes flèches. Esc pour quitter.


Installation des modules logiciels

L communication entre DLight et la Raspberry Pi se font par OSC, donc il faut installer la librairie pyOSC :

git clone git://gitorious.org/pyosc/devel.git
cd devel
sudo ./setup.py

Vérifier l'adresse de la Pi dans le réseau avec

ifconfig

modifier le fichier Tartuffe.py si nécessaire.

Interface

Le fichier config.xml :

<OSC>
	<adresse>/circ/</adresse>
	<portReception>7001</portReception>
</OSC>
<musique>
	<adresseDMX>100</adresseDMX>
	<fichier>musique.mp3</fichier>
</musique>
<canalArret circuit = 102>123</canalArret>
<canalArret circuit = 103>123</canalArret>
<seuilInterupteur circuit = 110>127</seuilInterupteur>
#pragma once

#include "ofMain.h"
#include "ofxXmlSettings.h"
#include "ofxOsc.h"

class ofApp : public ofBaseApp{
	
public:
	void setup();
	void update();
	void draw();
	
	void keyPressed(int key);
	void keyReleased(int key);
	void mouseMoved(int x, int y );
	void mouseDragged(int x, int y, int button);
	void mousePressed(int x, int y, int button);
	void mouseReleased(int x, int y, int button);
	void windowResized(int w, int h);
	void dragEvent(ofDragInfo dragInfo);
	void gotMessage(ofMessage msg);
	
		ofxXmlSettings XML;
		map<int, int> canauxArret;
		map<int, int> canaux;
		map<int, ofSoundPlayer*> discotheque;
		pair<int, int> interrupteur;
	
	// OSC
	ofxOscReceiver recepteurOSC;
	int portReceptionOSC;
	string adresseOSC;
	string messageOSC;
	string getOscMsgAsString(ofxOscMessage m);
};
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
	// XML
	if (XML.loadFile("config.xml")) {
		XML.pushTag("OSC");
		adresseOSC = XML.getValue("adresse", "");
		portReceptionOSC = XML.getValue("portReception", 0);
		XML.popTag();
		int num = XML.getNumTags("musique");
		for (int i = 0; i < num; i++) {
			XML.pushTag("musique", i);
			int indice = XML.getValue("adresseDMX", 0);
			discotheque[indice] = new ofSoundPlayer();
			string str = XML.getValue("fichier", "");
			discotheque[indice]->loadSound(str);
			discotheque[indice]->setVolume(0.0f);
			discotheque[indice]->setMultiPlay(false);
			
			XML.popTag();
			cout << indice << " : " << str << endl;
		}
		num = XML.getNumTags("canalArret");
		for (int i = 0; i < num; i++) {
			//XML.pushTag("canalArre
			canauxArret[XML.getAttribute("canalArret","circuit", 0, i)] = XML.getValue("canalArret", 0, i);
			canaux[XML.getAttribute("canalArret","circuit", 0, i)] = 0;
		}
		interrupteur = make_pair(XML.getAttribute("seuilInterupteur","circuit", 0, 0), XML.getValue("seuilInterupteur", 0, 0));
		cout << "Circuit interrupteur : " << interrupteur.first << ", seuil : " << interrupteur.second << endl;
		XML.clear();
	} else {
		ofLogError("Le fichier n'a pu etre lu");
	}
	
	// OSC
	recepteurOSC.setup(portReceptionOSC);
	cout << "Port reception : " << portReceptionOSC << endl;
}
//--------------------------------------------------------------
void ofApp::update(){
	while(recepteurOSC.hasWaitingMessages()){
		ofxOscMessage m;
		recepteurOSC.getNextMessage(&m);
		string adresse = m.getAddress();
		if (adresse.substr(0, adresseOSC.length()) == adresseOSC) {
			int circuit = ofToInt(adresse.substr(adresseOSC.length(), adresse.length()));
			int valeur = m.getArgAsInt32(0);
			if (canauxArret.find(circuit) != canauxArret.end()) {
				canaux[circuit] = valeur;
				//cout << canauxArret.size() << endl;
			}
			if (discotheque.find(circuit) != discotheque.end()) {
				if (valeur == 0) {
					if (discotheque[circuit]->getIsPlaying()) {
						discotheque[circuit]->stop();
					}
				} else {
					if (!discotheque[circuit]->getIsPlaying()) {
						discotheque[circuit]->play();
					}
					discotheque[circuit]->setVolume(ofMap(valeur, 1, 255, 0, 1));
				}
			}
		}
	}
	int drapeau = 0;
	for (map<int,int>::iterator it = canauxArret.begin(); it != canauxArret.end(); ++it) {
		if (canaux[it->first] == it->second) {
			drapeau++;
		}
	}
	if (drapeau == canauxArret.size()) {
		cout << "Au revoir" << endl;
		system("sudo halt");
	}
}

//--------------------------------------------------------------
void ofApp::draw(){
	
}

Modifier le fichier addons.make pour ajouter les addons:

ofxXmlSettings
ofxOsc

Installer la librairie WiringPi.

Modifier le fichier config.make pour la compilation.