Ultrasonic Theremin (3 / 4 steg)
Steg 3: Steg 3: kod
Hämta bifogade filer och kopiera och förbi koden i de relevanta filerna. Att lägga till keyClass.cpp och keyClass.h som nya filer.
ofApp.cpp kod
#include "ofApp.h"
int för att lagra byte data från Arduino.
int byteData;
//--------------------------------------------------------------
void ofApp::setup() {
Allmänna inställningar av utseendet på fönstret.
ofBackground(255);
ofSetColor(0);
seriell port setup. med hjälp av COM3 för Windows port.
Även använder överföringshastighet 9600, skiss samma i Arduino.
sampleRate = 44100; ställa in sampleRate
bufferSize = 512; ställa in bufferSize
för (int jag = 0; jag < n.size(); i ++) {/ / loopa igenom vektorn av anteckningar
Keys.emplace_back (nya Key(n[i])); eftersom jag använder en uniqe_ptr som jag kallar emplace_back istället för push_back
}
ofSoundStreamSetup (2, 0, denna, sampleRate bufferSize, 4); här inrätta jag anslutningen med ljudkortet med ofSoundStreamSetup
Serial.Setup ("/dev/cu.usbmodem1421", 9600); portnumret som ska vara unik på varje enhet och detta körs på en Mac och det är därför portnummer som är annorlunda. Se till att portnumret är korrekt innan du kör koden
}
//--------------------------------------------------------------
void ofApp::update() {
Enkelt om uttalande att informera användaren om Arduino skickar seriell meddelanden.
om (serial.available() < 0) {
MSG = "Arduino fel";
}
annat {
Medan uttalande ges loopa igenom seriell meddelanden när seriell.
samtidigt (serial.available() > 0) {
byte data som skrivits in i byteData som int.
byteData = serial.readByte();
byteData konverteras till en sträng för att rita senare.
MSG = "cm:" + ofToString(byteData);
}
}
}
//--------------------------------------------------------------
void ofApp::draw() {
Rita sträng version pf byteData fönstret.
ofDrawBitmapString (msg, 50, 100);
skriva ut byteData till konsolen.
Cout << byteData << oä;
Dessa om uttalanden kontrollerar särskilda avståndet från ultrasonic sensor och så beroende på avstånd en annan anteckning kommer att utlösas
om (byteData > = 1 & & byteData < = 2) {
nyckel [0] -> on ();
} annat {
nyckel [0] -> off();
}
om (byteData > = 3 & & byteData < = 4) {
nyckel [1] -> on ();
} annat {
nyckel [1] -> off(); }
om (byteData > = 5 & & byteData < = 6) {
nyckel [2] -> on ();
} annat {
nyckel [2] -> off();
}
om (byteData > = 7 & & byteData < = 8) {
nyckel [3] -> on ();
} annat {
nyckel [3] -> off();
}
om (byteData > = 9 & & byteData < = 10) {
nyckel [4] -> on ();
} annat {
nyckel [4] -> off();
}
om (byteData > = 11 & & byteData < = 12) {
nyckel [5] -> on ();
} annat {
nyckel [5] -> off();
}
om (byteData > = 13 & & byteData < = 14) {
nyckel [6] -> on ();
} annat {
nyckel [6] -> off();
}
om (byteData > = 15 & & byteData < = 16) {
nyckel [7] -> on ();
} annat {
nyckel [7] -> off();
}
}
void ofApp::audioOut (float * utgång, int bufferSize, int nChannels) {
för (int jag = 0; jag < bufferSize; jag ++) {/ / du behöver att gå igenom bufferSize
för (int j = 0; j < n.size(); j ++) {/ / loopa igenom vektorn av anteckningar
anteckningar += nyckel [j] -> play() / n.size();
}
myMix.stereo (anteckningar, utgångar, 0,5);
output [jag * nChannels] = utgångar [0];
output [jag * nChannels + 1] = utgångar [1].
}
}
< stark > ofApp.h < / strong >
#pragma en gång < br >
#include "ofMain.h"
#include "ofxMaxim.h"
#include "keyClass.h"
klass ofApp: offentliga ofBaseApp {
offentlig:
Standard funktioner.
void setup();
void update();
void draw();
void audioOut (float * ouput, int bufferSize, int nChannels);
int bufferSize, sampleRate;
dubbel anteckningar;
dubbla utgångar [2].
array av frekvenser
Vector n {261.63, 293.66, 329.63, 349.23, 392.00, 440,00, 493.88, 523.25};
Vector > nycklar;
maxiMix myMix;
Anpassade variabler för på skärmen strängen och teckensnitt.
sträng msg;
ofTrueTypeFont teckensnitt;
Nya seriella objekt.
ofSerial seriell;
};
keyClass.cpp kod
#include "keyClass.h" < br >
Key::Key (dubbel _f) {
Freq = _f;
env.setAttack(1000);
env.setDecay(1);
env.setSustain(1);
env.setRelease(1000);
}
ogiltig nyckel:: on () {
env.trigger = 1;
}
{ogiltig nyckel:: off()
env.trigger = 0;
}
dubbla nyckel:: play() {
återgå env.adsr(osc.sinewave(freq), env.trigger);
}
keyClass.h kod
#ifndef __keyboardofxMaxim__keyClass__ < br >
#define __keyboardofxMaxim__keyClass__
#include
#include "ofxMaxim.h"
klass nyckeln {
offentlig:
maxiOsc osc;
maxiEnv env;
dubbel freq;
Nyckel (dubbel _f);
Double Play ();
Annullera on ();
void off();
};
#endif / * defined(__keyboardofxMaxim__keyClass__) * /