amalgam/src/fmtest.cpp

83 lines
2.3 KiB
C++

/*
* 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 <stdio.h>
#include <stdlib.h>
#include <math.h>
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<double,double> 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;
}