まず,後の質問から答えますが,/home08/ktanaka/bin/txt2wav.plは
入力データを5秒のWAVデータになるまで繰り返し出力するので,1周期分の
データを出力するだけで5秒の音ができます.時間によって,変わる音を出す
場合は,5秒分以上(44100*5個以上)のデータを出力する必要があります.
以下に例を示します.
class doremi{
// 周波数hzの音をsec秒分出力する.
// 開始時の位相をパラメータradで渡して,終了時の位相を返す
static double sinWave(double rad,double hz,double sec){
int i;
for(i=0;i< sec*44100;i++){
System.out.println(10000*Math.sin(rad));
rad=rad+2*Math.PI*hz/44100;
}
return rad;
}
// ドレミの歌
public static void main(String[] args){
double rad=0.0;
// http://www.digion.com/dspark/waza/vol4/5.htm
// 各音の周波数
double DO=261.6; // 小文字にすると予約語doと重なる
double RE=293.6;
double MI=329.6;
double FA=349.2;
rad=sinWave(rad,DO,0.75); // ドの音を0.75秒
rad=sinWave(rad,RE,0.25); // レの音を0.25秒
rad=sinWave(rad,MI,0.75);
rad=sinWave(rad,DO,0.25);
rad=sinWave(rad,MI,0.5);
rad=sinWave(rad,DO,0.5);
rad=sinWave(rad,MI,1.0);
rad=sinWave(rad,RE,0.75);
rad=sinWave(rad,MI,0.25);
rad=sinWave(rad,FA,0.5);
rad=sinWave(rad,MI,0.25);
rad=sinWave(rad,RE,0.25);
rad=sinWave(rad,FA,1.0);
}
}
更に和音を出したい場合には,以下のようにsinWave2メソッドを定義して使います.
class t1{
// 周波数hzの音をsec秒分出力する.
// 開始時の位相をパラメータradで渡して,終了時の位相を返す
static double sinWave(double rad,double hz,double sec){
int i;
for(i=0;i< sec*44100;i++){
System.out.println(10000*Math.sin(rad));
rad=rad+2*Math.PI*hz/44100;
}
return rad;
}
// 周波数hz1, 周波数hz2の和音をsec秒分出力する.
// 開始時の位相をパラメータradで渡して,終了時の位相を返す
static double sinWave2(double rad1,double hz1,double hz2, double sec){
int i;
double rad2=0.0;
for(i=0;i< sec*44100;i++){
System.out.println(10000*(Math.sin(rad1)+Math.sin(rad2)));
rad1=rad1+2*Math.PI*hz1/44100;
rad2=rad2+2*Math.PI*hz2/44100;
}
return rad1;
}
public static void main(String[] args){
double rad=0.0;
// http://www.digion.com/dspark/waza/vol4/5.htm
// 各音の周波数
double DO=261.6; // 小文字にすると予約語doと重なる
double RE=293.6;
double MI=329.6;
double FA=349.2;
rad=sinWave2(rad,DO,MI,1);
rad=sinWave2(rad,DO,FA,1);
rad=sinWave(rad,RE,1);
rad=sinWave2(rad,DO,MI,1);
rad=sinWave2(rad,DO,FA,1);
}
}