#include #include #include "abuf.h" double miditofreq(int note) { return 440.0 * pow(2, (note - 69.0) / 12); } double miditophase(int note) { return miditofreq(note) / SRATE; } double voltomul(int level) { double x = level/127.0; return pow(2, 2*(x-1))*x; } void ainit(Abuf *ab, int fd) { ab->p = 0; ab->fd = fd; } void aflush(Abuf *ab) { write(ab->fd, ab->buf, ab->p); ab->p = 0; } void aput(Abuf *ab, sample n) { int p; uchar *s; p = ab->p; s = ab->buf + p; s[0] = n; s[1] = n >> 8; s[2] = n; s[3] = n >> 8; p += 4; if(p == ABUFSZ){ write(ab->fd, ab->buf, p); p = 0; } ab->p = p; } int aget(Abuf *ab, sample *n) { int p; uchar *s; p = ab->p; if(p == 0){ p = readn(ab->fd, ab->buf, ABUFSZ); if(p <= 0) return p; if(p % 4 != 0) return 0; } s = &ab->buf[ABUFSZ - p]; *n = s[0] + 256 * s[1]; ab->p = p - 4; return 1; } void aputd(Abuf *ab, double n) { aput(ab, (int)(n * SMAX)); } int agetd(Abuf *ab, double *n) { int r; sample s; r = aget(ab, &s); *n = s / SMAX; return r; }