/* * Filename: fmtest.cpp * * Description: * * * Version: * Created: Sun Mar 8 08:12:43 2020 * Revision: None * Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws * */ #include "FM/Engine.h" #include #include #include using namespace amalgam; int16_t toint16(double i) { double temp = i *= 32767; return floor(temp); } void writeBytes(FILE* file, char* bytes, unsigned int count) { for (int i = 0; i < count ; i++) putc(bytes[i],file); } int main(int argc, char** argv){ FM::Engine<2> *f = new FM::Engine<2>(); f->getOperator(0)->setAll(2.0,0.0,0.0); f->getOperator(0)->getEnvelope()->setAttackTime(1.0); f->getOperator(0)->getEnvelope()->setDecayTime(0.5); f->getOperator(0)->getEnvelope()->setMaxLevel(1.0); f->getOperator(0)->getEnvelope()->setModMode(true); // play until reset. f->getOperator(1)->getEnvelope()->setReleaseTime(2.5); f->getOperator(1)->setAll(1.0,0.0,0.0); f->setGainMatrix(0,0,0.0); // op1 fbl = 0 f->setGainMatrix(0,1,1.0); // op1 -> op2 = 1 f->setGainMatrix(1,0,0.0); // op2 -> op1 = 0 f->setGainMatrix(1,2,1.0); // op2 -> out = 1 f->freq = 440; f->gate = true; FILE* w = fopen("testwav.wav", "w"); fprintf(w,"RIFF"); double seconds = 20; uint32_t srate = 44100; unsigned int samples= floor(seconds*srate); uint16_t bps = 16; uint16_t channels = 2; uint32_t datasize = ((bps/8)*channels*samples); uint32_t fmtsize = 16; uint16_t type = 1; uint32_t riffsize = 20 + fmtsize + datasize; uint32_t byterate = srate * 1 * (bps/8); uint16_t blockalign = channels * (bps/8); char* l; writeBytes(w,(char*) &riffsize,4); fprintf(w,"WAVEfmt "); // size writeBytes(w,(char*) &fmtsize,4); // type writeBytes(w,(char*) &type,2); writeBytes(w,(char*) &channels,2); writeBytes(w,(char*) &srate,4); writeBytes(w,(char*) &byterate,4); writeBytes(w,(char*) &blockalign,2); writeBytes(w,(char*) &bps, 2); fprintf(w,"data"); writeBytes(w,(char*) &datasize, 4); for (int s = 0; s < samples; s++) { std::pair st = (*f)(); int16_t l = toint16(st.first/4.0); int16_t r = toint16(st.second/4.0); writeBytes(w,(char*) &l,2); writeBytes(w,(char*) &r,2); } fclose(w); return 0; }