2020-03-08 14:33:48 -04:00
|
|
|
/*
|
|
|
|
* Filename: fmtest.cpp
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Version:
|
|
|
|
* Created: Sun Mar 8 08:12:43 2020
|
|
|
|
* Revision: None
|
|
|
|
* Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-03-09 23:35:06 -04:00
|
|
|
#include "FM/Engine.h"
|
2020-03-08 14:33:48 -04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
2020-03-10 01:02:31 -04:00
|
|
|
using namespace amalgam;
|
2020-03-08 14:33:48 -04:00
|
|
|
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++) {
|
2020-03-08 14:44:49 -04:00
|
|
|
std::pair<double,double> st = (*f)();
|
|
|
|
int16_t l = toint16(st.first/4.0);
|
|
|
|
int16_t r = toint16(st.second/4.0);
|
2020-03-08 14:33:48 -04:00
|
|
|
writeBytes(w,(char*) &l,2);
|
|
|
|
writeBytes(w,(char*) &r,2);
|
|
|
|
}
|
|
|
|
fclose(w);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|