model "「ラ」の音を奏でるWAVファイルを生成する" { // constants var wav_freq=440; // 440Hz、「ラ」の音 var wav_secs=1.0; // 時間[s] var wav_ampl=0.5; // 振幅(0〜1) var wFormatTag=1; // Microsoft PCM var nChannels=1; // モノラル var nSamplesPerSec=44100; // 44.1[kHz] var wBitsPerSample=8; // 8ビット // variables macro dir,file,ext; pathsplit $(pathname), dir,file,ext; var nBlockAlign=nChannels×wBitsPerSample÷8; var nAvgBytesPerSec=nSamplesPerSec×nBlockAlign; if (nChannels!=1) { errmsg "未対応のパラメータです。:nChannels=#",nChannels; leave stop_error; } if (wBitsPerSample!=8 & wBitsPerSample!=16) { errmsg "未対応のパラメータです。:wBitsPerSample=#",wBitsPerSample; leave stop_error; } // procedures procedure fput_id fptr,$$wav_id { // 4文字のIDを書き出す var dat; macro chr; // 1文字目 substr chr=$(wav_id),1,1; chr2num dat=$(chr); fputb fptr,dat; // 2文字目 substr chr=$(wav_id),2,1; chr2num dat=$(chr); fputb fptr,dat; // 3文字目 substr chr=$(wav_id),3,1; chr2num dat=$(chr); fputb fptr,dat; // 4文字目 substr chr=$(wav_id),4,1; chr2num dat=$(chr); fputb fptr,dat; } procedure fput_int fptr,idat { // 32ビットの整数値をリトルエンディアンで書き出す var dat; // 1バイト目 dat=@@(idat&0xff); idat=@@(idat>>8); fputb fptr,dat; // 2バイト目 dat=@@(idat&0xff); idat=@@(idat>>8); fputb fptr,dat; // 3バイト目 dat=@@(idat&0xff); idat=@@(idat>>8); fputb fptr,dat; // 4バイト目 dat=@@(idat&0xff); idat=@@(idat>>8); fputb fptr,dat; } procedure fput_short fptr,sdat { // 16ビットの整数値をリトルエンディアンで書き出す var dat; // 1バイト目 dat=@@(sdat&0xff); sdat=@@(sdat>>8); fputb fptr,dat; // 2バイト目 dat=@@(sdat&0xff); sdat=@@(sdat>>8); fputb fptr,dat; } // WAVファイルを生成する var fout; fopen fout,$(dir)$/$(file)".wav","w"; // "RIFF" + fput_id fout,"RIFF"; fput_int fout,0; // ダミー、後で書き直す。 // "WAVE" + "fmt " + fput_id fout,"WAVE"; fput_id fout,"fmt "; fput_int fout,16; // fmtのバイト数=16 // fmtの各要素(全部で16バイト) fput_short fout,wFormatTag; fput_short fout,nChannels; fput_int fout,nSamplesPerSec; fput_int fout,nAvgBytesPerSec; fput_short fout,nBlockAlign; fput_short fout,wBitsPerSample; // "data" + fput_id fout,"data"; fput_int fout,nAvgBytesPerSec*wav_secs; // 「ラ」の音の波形を生成する。 var idx; var dat; var spl; spl=nSamplesPerSec*wav_secs; idx=0; while (idxは4バイト目 fput_int fout,fsiz - 8; // ファイルサイズから"RIFF"+分の // 8を減算すると、RIFFサイズとなる。 // 完成 fclose fout; }