Skip to content

Instantly share code, notes, and snippets.

@hclarke
Created November 13, 2017 00:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hclarke/4be53b38786653cda5339d3e20ab44ef to your computer and use it in GitHub Desktop.
Save hclarke/4be53b38786653cda5339d3e20ab44ef to your computer and use it in GitHub Desktop.
making audio from recursive sequences
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <string.h>
#include <math.h>
void putu32(FILE* f, uint32_t x) {
for(int i = 0; i < 4; ++i) {
putc(x&0xFF, f);
x = x>>8;
}
}
void putu16(FILE* f, uint16_t x) {
for(int i = 0; i < 2; ++i) {
putc(x&0xFF, f);
x = x>>8;
}
}
int main(int argc, char** argv) {
FILE* f = stdout;
assert(f);
static const int sample_count = 4000;
static const uint32_t sample_rate = 4410;
static const float gain = 30.0;
int r[sample_count];
for(int i = 0; i < sample_count; ++i) r[i] = 1;
switch(argv[1][0]) {
case 'c':
for(int i = 3; i < sample_count; ++i) r[i] = r[i-r[i-1]] + r[i-r[i-2]];
for(int i = 0; i < sample_count; ++i) r[i] -= i/2;
break;
case 'e':
for(int i = 3; i < sample_count; ++i) r[i] = r[r[i-1]] + r[i-r[i-2]-1];
for(int i = 0; i < sample_count; ++i) r[i] -= i/2;
break;
case 'f':
for(int i = 3; i < sample_count; ++i) r[i] = r[r[i-1]] + r[i-2*r[i-2]+1];
for(int i = 0; i < sample_count; ++i) r[i] -= (int)(0.42*pow(i, 0.878));
break;
}
//set up sample rate and such
static const uint16_t channels = 1;
static const uint32_t bytes_per_sample = 2;
uint32_t data_size = sample_count *bytes_per_sample * channels;
//RIFF chunk
fprintf(f, "RIFF");
putu32(f, data_size + 36);
fprintf(f, "WAVE");
//fmt chunk
fprintf(f, "fmt ");
putu32(f, 16); //size of this chunk
putu16(f, 1); //1 = PCM
putu16(f, channels);
putu32(f, sample_rate);
putu32(f, sample_rate * bytes_per_sample * channels);
putu16(f, bytes_per_sample * channels);
putu16(f, bytes_per_sample * 8);
//data chunk
fprintf(f, "data");
putu32(f, data_size);
for(int sample = 0; sample < sample_count; ++sample) {
int x = r[sample] * gain;
uint16_t pcm_sample = (int16_t)(x);
putu16(f, pcm_sample);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment