Audio to MIDI/Serial spectrum analyzer VJ:lle, taiteilijoille ja hardware-hakkereille -työpaja osana Swäg 15v juhlaohjelmaa
24.3. alkaen klo. 11.00 Lielahden kartanolla Hiedanrannassa, kokoushuone Mariessa. Kesto noin viisi tuntia.
Työpajassa rakennetaan seitsemällä eri taajuusalueella äänisignaalia reaaliajassa analysoiva laite, sekä käydään läpi laitteen analoginen ja digitaalinen toimitaperiaate sekä siihen liittyvä koodi. Laitteen prosessorina toimii Arduino Pro -mikrokontrolleri.
Tietokoneiden sisään rakennetut äänikortit eivät ole suunniteltu äänen analysointiin tai äänitykseen lyhyellä viiveellä. Tämä on tuttua erityisesti VJ:lle ja muille ääneen ja musiikkiin visualisointeja tekeville. Äänen sisäänmenon viive on yleensä niin suuri, että esimerkiksi äänireaktiivisten vj-esitysten toiminta on vähintäänkin epävarmaa, tai ei käytännössä onnistu. Työpajassa rakennettava laite tekee tämän analyysin tietokoneen puolesta seitsemällä eri taajuusalueella. Koska äänimateriaalin data siirtyy tietokoneeseen 8-bittisinä numeroina, sitä voidaan käyttää erilaisten parametrien ohjaamiseen lähes ilman latenssia. Tämä säästää myös tietokoneen prosessoriaikaa.
Tämä data siirtyy tietokoneeseen joko perinteisellä serial yhteydellä tai class compliant UsbMidinä, tarkoittaen, että mikäli käytettävä ohjelmisto tukee Midiä, näkee tietokone laiteen Midi interfacena automaattisesti. Valinta Serial ja Midi datan välillä tehdään aina ennen laitteen kiinnittämistä tietokoneeseen. Koko laite saa virtansa usb-liitännän yli. Serial-yhteyttä tukevat mm. Max/msp sekä Touchdesigner -ohjelmistot. Midi-protokollaa tukevat melkein kaikki ääni-, video- ja vj-ohjelmistot. Laite analysoi erikseen seuraavat taajuusalueet: 63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz, 16kHz.
Laitteella voidaan säätää äänenvoimakkuus ennen analysointia niin, että vaikka livetilanteessa äänentaso vaihtelisi, voidaan sitä kompensoida manuaalisesti. Workshop maksaa 65 euroa sisältäen materiaalit. Maksu suoritetaan käteisellä paikanpäällä. Aiempi kokemus kolvaamisesta, elektroniikasta tai koodamisesta ei ole välttämätöntä; kaikki poistuvat työpajasta mukanaan toimiva laite.
Sitovat ilmoittautumiset sähköpostitse osoitteeseen info@anttipussinen.net.
Työpajaan mahtuu 10 henkilöä. Mikäli omistat kolvin tai muita asiaan liittyviä työkaluja kuten katkaisupihdit tai tinaimurin, ota ne mukaan ja ilmoita siitä ilmoittautumisen yhteydessä. Muille osallistujille järjestetään työkalut. Tekniset tiedot:
– Stereo audio input
– 60 to +24 db gain adjustment
– Analyzation to 7 bands, middle frequencies, 63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz, 16kHz
– Data transfer to computer using serial, variable baud rates, value: 0-255
– Data transfer to computer using UsbMIDI, baud rate varies with OS, value 0-127
– Measured latency from audio to serial/midi ~ 1.3 ms
– Midi class compliant interface
– USB powered
Code and programming, from arduino IDE select arduino Pro micro or arduino leonardo as a board and then upload following code
Arduino Code:
include “MIDIUSB.h”
int strobe = 10; // strobe pins on digital 10
int res = 9; // reset pins on digital 9
int audio[7]; // store band values in these arrays
int Hz = 0;
int MidiCC = 70;
int band;
int selector_pin = 2;
boolean selector_state = true;
int led_pin = 16;
int treshold = 126;
boolean clip = false;
int clip_loop_count = 0; // extend led on for x loops
int clip_loop_max = 3; //
void setup() {
pinMode(res, OUTPUT); // reset
pinMode(strobe, OUTPUT); // strobe
digitalWrite(res,LOW); // reset low
digitalWrite(strobe,HIGH); //pin 9 is RESET on the shield
pinMode(selector_pin, INPUT_PULLUP);
pinMode(led_pin, OUTPUT);
selector_state = digitalRead(selector_pin);
}
void readMSGEQ7()
// Function to read 7 band equalizers
{
digitalWrite(res, HIGH);
digitalWrite(res, LOW);
delayMicroseconds(72); // delay after reset
for(band=0; band <7; band++)
{
digitalWrite(strobe,LOW); // strobe pin on the chip – move to next band
delayMicroseconds(32); //
audio[band] = analogRead(0); // store left band reading
digitalWrite(strobe,HIGH);
Hz = audio[band] >> 3;
MidiCC = band + 70;
if (Hz >= treshold)
{
clip = true;
clip_loop_count = 0;
}
else if (Hz < treshold)
{
clip = false;
}
midiEventPacket_t midiCc = { 0x0B, 0xB0, MidiCC, Hz };
MidiUSB.sendMIDI(midiCc);
MidiUSB.flush();
delayMicroseconds(1000);
}
}
void readMSGEQ7_Serial()
// Function to read 7 band equalizers
{
digitalWrite(res, HIGH);
digitalWrite(res, LOW);
delayMicroseconds(72); //
for(band=0; band <7; band++)
{
digitalWrite(strobe,LOW); // strobe pin on the shield – kicks the IC up to the next band
delayMicroseconds(32); //
audio[band] = analogRead(0); // store left band reading
digitalWrite(strobe,HIGH);
Hz = audio[band] >> 3;
MidiCC = band + 70;
Serial.print(band, DEC);
Serial.print(” “);
Serial.print(Hz, DEC);
Serial.print(‘\n’);
Serial.flush();
delayMicroseconds(1000);
}
}
void loop() {
if (selector_state == true)
{
readMSGEQ7();
}
if (selector_state == false)
{
readMSGEQ7_Serial();
}
// treshhlod led code
if (clip == true)
{
digitalWrite(led_pin, HIGH);
clip_loop_count++;
clip == false;
}
else if (clip_loop_count <= clip_loop_max)
{
//digitalWrite(led_pin, HIGH);
clip_loop_count++;
}
else if (clip_loop_count > clip_loop_max)
{
digitalWrite(led_pin, LOW);
clip_loop_count = 0;
}
else if (clip == false && clip_loop_count == 0)
{
digitalWrite(led_pin, LOW);
}
}