#include "ofApp.h"
void ofApp::setup(){
ofBackground(34, 34, 34);
int bufferSize = 512;
sampleRate = 44100;
phase = 0;
phaseAdder = 0.0f;
phaseAdderTarget = 0.0f;
volume = 0.1f;
bNoise = false;
lAudio.assign(bufferSize, 0.0);
rAudio.assign(bufferSize, 0.0);
soundStream.printDeviceList();
ofSoundStreamSettings settings;
#ifdef TARGET_LINUX
auto devices = soundStream.getMatchingDevices("default");
if(!devices.empty()){
settings.setOutDevice(devices[0]);
}
#endif
settings.setOutListener(this);
settings.sampleRate = sampleRate;
settings.numOutputChannels = 2;
settings.numInputChannels = 0;
settings.bufferSize = bufferSize;
soundStream.setup(settings);
}
void ofApp::update(){
}
void ofApp::draw(){
ofSetColor(225);
ofDrawBitmapString("AUDIO OUTPUT EXAMPLE", 32, 32);
ofDrawBitmapString("press 's' to unpause the audio\npress 'e' to pause the audio", 31, 92);
ofNoFill();
ofPushStyle();
ofPushMatrix();
ofTranslate(32, 150, 0);
ofSetColor(225);
ofDrawBitmapString("Left Channel", 4, 18);
ofSetLineWidth(1);
ofDrawRectangle(0, 0, 900, 200);
ofSetColor(245, 58, 135);
ofSetLineWidth(3);
ofBeginShape();
for (unsigned int i = 0; i < lAudio.size(); i++){
float x = ofMap(i, 0, lAudio.size(), 0, 900, true);
ofVertex(x, 100 -lAudio[i]*180.0f);
}
ofEndShape(false);
ofPopMatrix();
ofPopStyle();
ofPushStyle();
ofPushMatrix();
ofTranslate(32, 350, 0);
ofSetColor(225);
ofDrawBitmapString("Right Channel", 4, 18);
ofSetLineWidth(1);
ofDrawRectangle(0, 0, 900, 200);
ofSetColor(245, 58, 135);
ofSetLineWidth(3);
ofBeginShape();
for (unsigned int i = 0; i < rAudio.size(); i++){
float x = ofMap(i, 0, rAudio.size(), 0, 900, true);
ofVertex(x, 100 -rAudio[i]*180.0f);
}
ofEndShape(false);
ofPopMatrix();
ofPopStyle();
ofSetColor(225);
string reportString = "volume: ("+ofToString(volume, 2)+") modify with -/+ keys\npan: ("+ofToString(pan, 2)+") modify with mouse x\nsynthesis: ";
if( !bNoise ){
reportString += "sine wave (" + ofToString(targetFrequency, 2) + "hz) modify with mouse y";
}else{
reportString += "noise";
}
ofDrawBitmapString(reportString, 32, 579);
}
void ofApp::keyPressed (int key){
if (key == '-' || key == '_' ){
volume -= 0.05;
volume = MAX(volume, 0);
} else if (key == '+' || key == '=' ){
volume += 0.05;
volume = MIN(volume, 1);
}
if( key == 's' ){
soundStream.start();
}
if( key == 'e' ){
soundStream.stop();
}
}
void ofApp::keyReleased (int key){
}
void ofApp::mouseMoved(int x, int y ){
int width = ofGetWidth();
pan = (float)x / (float)width;
float height = (float)ofGetHeight();
float heightPct = ((height-y) / height);
targetFrequency = 2000.0f * heightPct;
phaseAdderTarget = (targetFrequency / (float) sampleRate) * TWO_PI;
}
void ofApp::mouseDragged(int x, int y, int button){
int width = ofGetWidth();
pan = (float)x / (float)width;
}
void ofApp::mousePressed(int x, int y, int button){
bNoise = true;
}
void ofApp::mouseReleased(int x, int y, int button){
bNoise = false;
}
void ofApp::mouseEntered(int x, int y){
}
void ofApp::mouseExited(int x, int y){
}
void ofApp::windowResized(int w, int h){
}
void ofApp::audioOut(ofSoundBuffer & buffer){
float leftScale = 1 - pan;
float rightScale = pan;
while (phase > TWO_PI){
phase -= TWO_PI;
}
if ( bNoise == true){
for (size_t i = 0; i < buffer.getNumFrames(); i++){
lAudio[i] = buffer[i*buffer.getNumChannels() ] = ofRandom(0, 1) * volume * leftScale;
rAudio[i] = buffer[i*buffer.getNumChannels() + 1] = ofRandom(0, 1) * volume * rightScale;
}
} else {
phaseAdder = 0.95f * phaseAdder + 0.05f * phaseAdderTarget;
for (size_t i = 0; i < buffer.getNumFrames(); i++){
phase += phaseAdder;
float sample = sin(phase);
lAudio[i] = buffer[i*buffer.getNumChannels() ] = sample * volume * leftScale;
rAudio[i] = buffer[i*buffer.getNumChannels() + 1] = sample * volume * rightScale;
}
}
}
void ofApp::gotMessage(ofMessage msg){
}
void ofApp::dragEvent(ofDragInfo dragInfo){
}
Comments