kagome_kagome.c (3379B)
- //#define _POSIX_C_SOURCE 200809L
- #define _XOPEN_SOURCE 700
- #include <stdio.h>
- #include <inttypes.h> // uint32_t
- #include <math.h> // sinf(), M_PI, pow()
- #include <stdlib.h> // abort()
- #include "au.h"
- #include "effects.h"
- #include "instruments.h"
- #include "misc.h"
- void
- sin_note(int dur, struct au_header *header, int hertz, float volume) {
- char buf[4];
- for(int t = 0;t<dur;t++) {
- float tune = clarinet(header, hertz, t);
- float vol = crossfade(dur, t, volume);
- putchar((uint8_t)(tune * vol));
- }
- }
- #if 0
- void
- note(int dur, int pitch) {
- for(int t = 0;t<dur;t++) {
- putchar( t*pitch );
- }
- }
- #else
- #define REF_TUNE 430*1
- #define VOLUME 60
- #define note(dur,pitch) sin_note(dur, header, note_to_hertz(REF_TUNE, pitch-8), VOLUME)
- #endif
- void
- kagome_kagome(struct au_header *header) {
- int tick = header->samplerate / 2;
- int note = tick * 1.0;
- int gap = tick * 0.00;
- note(note*2, 8); silence(gap*2);
- note(note*1, 8); silence(gap);
- note(note*1, 9); silence(gap);
- // ----
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- silence(tick*1);
- // ----
- note(note*1, 8); silence(gap);
- note(note/2, 8); silence(gap/2);
- note(note/2, 8); silence(gap/2);
- note(note*1, 8); silence(gap);
- note(note/2, 7); silence(gap/2);
- note(note/2, 7); silence(gap/2);
- // ----
- note(note*1, 8); silence(gap);
- note(note/2, 8); silence(gap/2);
- note(note/2, 7); silence(gap/2);
- note(note*1, 5); silence(gap);
- silence(tick*1);
- // ----
- note(note, 8); silence(gap);
- note(note, 7); silence(gap);
- note(note, 8); silence(gap);
- note(note, 7); silence(gap);
- // ----
- note(note*1, 8); silence(gap);
- note(note/2, 8); silence(gap/2);
- note(note/2, 7); silence(gap/2);
- note(note*1, 5); silence(gap);
- silence(tick*1);
- // ----
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- note(note*1, 9); silence(gap);
- // ----
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- silence(tick*1);
- // ----
- note(note*1, 8); silence(gap);
- note(note/2, 7); silence(gap/2);
- note(note/2, 7); silence(gap/2);
- note(note*1, 8); silence(gap);
- note(note/2, 7); silence(gap/2);
- note(note/2, 7); silence(gap/2);
- // ----
- note(note*1, 8); silence(gap);
- note(note*1, 8); silence(gap);
- note(note*1, 5); silence(gap);
- silence(tick*1);
- // ----
- note(note/2, 8); silence(gap/2);
- note(note/2, 8); silence(gap/2);
- note(note/2, 8); silence(gap/2);
- note(note/2, 8); silence(gap/2);
- note(note*1, 8); silence(gap);
- note(note*1, 9); silence(gap);
- // ----
- note(note*1, 8); // silence(gap);
- note(note*1, 7); silence(gap);
- note(note*1, 8); silence(gap);
- silence(tick*1);
- }
- int
- main(void)
- {
- // Use AU defaults
- struct au_header header = {
- .offset = 24, // no-annotation, in octets
- .length = 0xFFFFFFFF, // unknown data size
- .encoding = AU_ENCODING_8B_LPCM,
- .samplerate = 48000, // Hz
- .channels = 1
- };
- // fd 1 is stdout
- write_au_header(1, &header);
- kagome_kagome(&header);
- // dur pt vol del
- //sin_note(header.samplerate, &header, 440, 150, 0);
- //sin_note(header.samplerate/2, &header, note_to_hertz(440, 0), 150, 0);
- //sin_note(header.samplerate/4, &header, note_to_hertz(440, 1), 150, 0);
- //sin_note(header.samplerate/4, &header, note_to_hertz(440, 1), 150, 0);
- return 0;
- }