Tiny MML
Posted feedbacks - C
サンプリングレート: 8000 PCMフォーマット: 8bit % gcc sound.c -lm でコンパイル出来ます、linux で鳴るはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | include <stdio.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/soundcard.h>
#define RATE 8000
double sol_fa[] = {880.0, 987.0, 523.0, 587.0, 659.0, 698.0, 784.0};
void play(int fd, const char *str){
int i, j;
unsigned char buf[RATE];
double freq;
int len = strlen(str);
for(i=0; i<len; i++){
if('a' <= str[i] && str[i] <= 'g')
freq = sol_fa[str[i] - 'a'];
else
freq = 0;
for (j = 0;j < RATE; j++)
buf[j] = 255 * sin(2.0 * M_PI * freq * j / RATE);
write(fd, buf, RATE);
}
}
int main( void )
{
int fd;
int fmt = AFMT_U8;
int channels = 1;
int rate = RATE;
fd = open("/dev/dsp", O_WRONLY);
ioctl(fd, SOUND_PCM_SETFMT, &fmt);
ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &channels);
ioctl(fd, SOUND_PCM_WRITE_RATE, &rate);
play(fd, "cdefedcrefgagfercrcrcrcrcdefedcr");
close(fd);
return 0;
}
|
周波数は計算で出したかったのですけど複雑なので諦めました☆ その代わりきらきら星をつけました☆
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include<windows.h>
void play(char *p){
for(int f[]={494,261,294,329,349,392,440};*p;p++)
if(*p=='r')
Sleep(400);
else
Beep(f[*p%7],400);
}
int main(void){
play("cdefedcrefgagfercrcrcrcrcdefedcr");
play("ccggaagrffeeddcrggffeedrggffeedrccggaagrffeeddcr");
return 0;
}
|



にしお
#3387()
Rating0/0=0.00
入力はcがド、dがレ、eがミ、fがファ、gがソ、aがラ、bがシ、rが休符とします。この8文字以外の文字は入力に含まれていないと仮定して構いません。おのおのの音符・休符は八分音符・八分休符とします。
オクターブや音の長さの変更、同時発音などの機能は不要です。
サンプル入力(カエルの歌)
[ reply ]