七行プログラミング part4
■ このスレッドは過去ログ倉庫に格納されています
0867デフォルトの名無しさん
05/03/08 21:41:40unsigned d=22050,f,t=1,v=16383;char*a,b[999],*l="cdefgabr",o=0,*p,*q,r[]={-7,-5,
-3,-2,0,2,4,-1};w(z){fwrite(&z,4,1,p);}main(c,x)char**x;{p=fopen("i","r");fgets(
b,999,p);fclose(p);p=fopen("o","wb");for(a=b;*a;++a){(q=strchr(l,*a))?f=(o>0?440
<<o:440>>-o)*pow(2,(12.0+r[q-l]+(*a-43?0:1))/12.0-1),d=(atol(a+1)?88200/atol(a+1
):d),w(q-l-7?t:3),w(f),w(d),w(v):*a-111?*a-118?*a-64?*a-60?a-62?0:o++:o--:(t=at\
oi(a+1)):(v=1.0*atoi(a+1)*32767.0/128.0):(o=atoi(a+1)-4);}fclose(p);}
mml2o
mmlを中間ファイルに変換。iを読み込みoに吐き出す。
unsigned*b,d[9][999][5],l[9],g,q;char*p,a[]="o8",i,j,k;w(m){fwrite(&q,m,1,p);}t(
){q+=sin(.0001424758573*b[1]*b[4])*b[3];}u(){q+=rand()*b[3]*2-b[3];}main(){for(i
=9;i--;a[1]--)if(p=fopen(a,"rb")){for(j=0;fread(d[i][j],4,4,p);j++);fclose(p);}p
=fopen("w","wb");fputs("RIFF",p);w(4);fputs("WAVEfmt ",p);q=16;w(4);q=65537;w(4)
;q=44100;w(4);q*=2;w(4);q=1048578;w(4);fputs("data",p);w(4);for(i=1,q=0;i;w(2),
g++,q=0)for(i=0,j=9;j--;)if(k=(b=d[j][l[j]])[0]){i=1;k-2?k-1?0:t():u();b[2]-b[4]
?b[4]++:l[j]++;}fseek(p,4,0);q=36+g*2;w(4);fseek(p,40,0);q-=36;w(4);fclose(p);}
o2wav
中間ファイルをriff wavに変換。o0〜o8(1〜9トラック)を読み込みwに吐き出す。
mml2wavを作ろうと思ったけど7行は無理だったので二つに分割。
MMLで使えるものはcdefgab(音階),r(休符),音の長さ(1〜),v(ボリューム,0~127),@(音色,1-正弦波,2-ノイズ),o(オクターブ指定,1〜8)です。
■ このスレッドは過去ログ倉庫に格納されています