#include #include #include "Gamma/AudioIO.h" #include "Gamma/Domain.h" #include "Gamma/Oscillator.h" #include "Gamma/Filter.h" using namespace gam; using namespace std; int frameCount = 512; int samplingRate = 44100; int channels; LFO<> lfo(2); Biquad<> biquad(880.0, 250.0, LOW_PASS); class Speaker { public: Speaker(double az, double el, double dist) : azimuth(az), elevation(el), distance(dist) {} double azimuth; double elevation; double distance; }; typedef vector Speakers; Speakers spks; float angle = 0; float anglesPerSample = 0.001; vector computeGains(float angle, Speakers &spks) { int index1 = -1 , index2 = -1; for (int i = 0; i < spks.size(); i++) { if (spks.at(i).azimuth > angle) { index2 = i; index1 = (i - 1) % spks.size(); break; } } if (index1 == -1) { index1 = spks.size() - 1; index2 = 0; } vector gains(spks.size()); for (int i = 0; i < spks.size(); i++) { gains.at(i) = 0.0; } float speakerAngle1 = spks.at(index1).azimuth; float speakerAngle2 = spks.at(index2).azimuth; if (speakerAngle2 < speakerAngle1) { speakerAngle2 += 360; } gains.at(index1) = cos(0.5 * M_PI * ((angle - speakerAngle1)/(speakerAngle2 - speakerAngle1))); gains.at(index2) = cos(0.5 * M_PI * ((speakerAngle2 - angle)/(speakerAngle2 - speakerAngle1))); return gains; } void audioCallBack(AudioIOData& io) { vector gains; while(io()) { float trig = lfo.imp(); float source = biquad(trig); gains = computeGains(angle, spks); for (int i = 0; i < channels; i++) { io.out(i) = source * gains.at(i); } angle += anglesPerSample; while (angle >= 360.0) { angle -= 360.0; } } std::cout << "Angle :" << angle; for (int i = 0; i < gains.size(); i++) { std::cout << " " << i << ":" << gains.at(i); } std::cout << std::endl; } int main() { spks.push_back(Speaker(0, 0, 2)); spks.push_back(Speaker(45, 0, 2)); spks.push_back(Speaker(90, 0, 2)); spks.push_back(Speaker(135, 0, 2)); spks.push_back(Speaker(180, 0, 2)); spks.push_back(Speaker(225, 0, 2)); spks.push_back(Speaker(270, 0, 2)); spks.push_back(Speaker(315, 0, 2)); channels = spks.size(); AudioIO audioIO(frameCount, samplingRate, audioCallBack, NULL, channels, 1); Sync::master().spu(audioIO.framesPerSecond()); audioIO.start(); printf("Press 'enter' to quit...\n"); getchar(); return 0; }