From a8609ccd901b1942e862c14205026d841e640add Mon Sep 17 00:00:00 2001 From: EliteTK Date: Thu, 10 Jul 2014 22:35:35 +0100 Subject: More stuff. --- hertz.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 hertz.c (limited to 'hertz.c') diff --git a/hertz.c b/hertz.c new file mode 100644 index 0000000..bed01d9 --- /dev/null +++ b/hertz.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include + +static long int sfreq; + +void playtone(long int, int, long int, float); +void playtone_pwm(long int, long int, int, long int); +void sinetone(float, int, float); + +int main(int argc, char **argv) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + sfreq = strtol(argv[1], NULL, 10); + + /*for (int i = 1; i < 3000; i++)*/ + /*sinetone(i, 127, 5);*/ + + for (int i = 1; i < 3000; i++) + sinetone(i, 127, 1.0/i * 1000.0); + + /*for (int i = 0; i < 1000; i++) {*/ + /*long int pulse_width = 441;*/ + + /*float duty_cycle = (sinf(i / 5.0 * M_PI) + 1.0) / 2.0;*/ + + /*for (int ii = 0; ii < ceilf(duty_cycle * pulse_width); ii++)*/ + /*putchar(0);*/ + /*for (int ii = 0; ii < floorf((1.0 - duty_cycle) * pulse_width); ii++)*/ + /*putchar(255);*/ + /*}*/ + + /*playtone_pwm(160, 80, 127, 10000);*/ + /*for (float i = 0; i < 1; i+=0.01)*/ + /*playtone(100, 127, 10, i);*/ + return 0; +} + +void playtone(long int freq, int ampl, long int time, float duty_cycle) +{ + if (ampl > 127) + ampl = 127; + long int pulse_width = sfreq / freq; + + long int total_waves = time * freq / 1000; + + for (long int wi = 0; wi < total_waves; wi++) { + int i; + for (i = 0; i < (int)((float)pulse_width * duty_cycle); i++) + putchar(128-ampl); + for (i = 0; i < (int)((float)pulse_width * (1.0 - duty_cycle)); i++) + putchar(255+ampl); + } +} + +void playtone_pwm(long int freq, long int freq_pwm, int ampl, long int time) +{ + if (ampl > 127) + ampl = 127; + + long int pulse_width = sfreq / freq; + + long int total_waves = time * freq / 1000; + + for (long int wi = 0; wi < total_waves; wi++) { + int i; + float pulse_proportion = (sinf((float)wi / (float)total_waves * time / freq_pwm * 2 * M_PI) + 1) / 2; + for (i = 0; i < (int)((float)pulse_width * pulse_proportion); i++) + putchar(128-ampl); + for (i = 0; i < (int)((float)pulse_width * (1.0 - pulse_proportion)); i++) + putchar(255+ampl); + } +} + +void sinetone(float freq, int ampl, float time) +{ + if (ampl > 127) ampl = 127; + + float wave_length = sfreq / freq; + + for (long int wi = 0; wi < time * sfreq / 1000; wi++) + putchar((char)((sinf((float)wi / wave_length * M_PI_2 * 4) + 1) * ampl)); +} -- cgit v1.2.3-54-g00ecf