音の出し方

[戻る]
ゆうき 2003/10/27(月) 09:24:02
次のプログラムで何処を変更すればいろいろな音がだせるのでしょうか。
ある本のサンプルプログラムです。

#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
#include <math.h>

void main()
{
    short int *idata;       //音声波形データエリア:2byte 整数型
    float   amp = 1.0f;     //倍率は通常1
    float   skhz = 8.0f;    //サンプリング (標本化) 周波数
    double  omega;          //各周波数ω
    double  PI = 3.1415926; //円周率π
    char    sbuf[128];      //文字列(string)のバッファ
    char    filenm[128], filenmprt1[5], filenmprt2[3];
                            //ファイル名関係の格納エリア
    long int lsec, n, i;    //lsecは時間長、nはデータサンプル数
                            //iは変数
    double f, t;            //fは生成する正弦波信号波形の周波数
                            //tは時間変数(秒)
    long int iflgda;        //サウンド・ライブラリで使うエラーフラグ

    // 音信号波形データエリアの割り当て(48kHzサンプリングで100秒分)
    idata = (short int *) malloc(4800000);

/*****************************************************************
*   波形の長さ(秒),波形の周波数(Hz),波形格納ファイル名入力   *
*****************************************************************/
labell:printf("\n******************************************************\
               \n* 正弦波信号を生成するサンプルプログラムへようこそ! *\
               
\n******************************************************\
               \n\n 時間長(100秒以下)を入力してください(Enter=終
了):");
       gets(sbuf);                    //キーボードから文字入力
       lsec = atoi(sbuf);             //文字列□整数型変換
       strcpy(filenmprt2, sbuf);       //ファイル名の一部に時間長情報加入
       n = lsec * (long) skhz * 1000; //データ総数計算
       if(n <= 0) return;             //nが正でないなら終了

       printf("波形の周波数(Hz)を入力してください:");
       gets(sbuf);                    //キーボードから文字列入力
       f = atof(sbuf);                //文字列□実数型変換
       strcpy(filenmprt1, sbuf);      //ファイル名の一部に周波数情報加入

       printf("ファイル名を入力してください(Enter=自動生成):");
       gets(filenm);
       if(strlen(filenm) == 0){
       //文字列の書き込みがなければ時間長・周波数情報よりファイル名自動再生
       //例:SINE440Hz10s.wav(周波数440Hzで10秒長の正弦波,wav形式)
           strcpy(filenm,"SINE");
           strcat(filenm,filenmprt1);
           strcat(filenm,"Hz");
           strcat(filenm,filenmprt2);
           strcat(filenm,"s.wav");
       }
       //文字列が書き込まれていれば、その文字列がファイル名

       printf("\n作成されるファイル名:%s\n", filenm);  //ファイル名プリントアウト

/***********************
*   音信号波形の作成   *
***********************/
       omega = 2.0 * PI * f;            //ω = 2πf
       printf("\nPI = %f f = %f omega = %f\n\n", PI, f, omega);
       for(i = 0;i < n;i++){
           t = (double) i/skhz/1000.0;  //t = i/Hz 単位のサンプリング周波
数
           idata[i] = (short int)30000.0 *amp *sin(omega *t);
                                        //idata = 30000amp・sinωt

       //   デバック用データ打ち出し (通常はコメントアウトしておく)
            printf("testda:t = %10.6f, idata[%4] = %6d\n\n", t, i, idata
[i]);

       }
       for(i = 0;i < n;i++){
           t = (double) i/skhz/1000.0;  //t = i/Hz 単位のサンプリング周波
数
           idata[i] = (short int)20000.0 *amp *sin(omega *t);
       }

       printf("--Testda 正常終了 --\n\n");
       goto labell;
}

FrozenAquarium 2003/10/27(月) 09:51:35
サンプルプログラム丸ごと転載することは
許可されてるんですね?
著作権関係も大丈夫ですね?

ゆうき 2003/10/27(月) 10:40:12
一応自分なりに不必要なところは消していますので、丸ごとではないです。
それに自分で打ったし、ソースは保護されないと思いましたが。
それは置いておいて、”音信号の波形”をいじるんだと予想はつくんですがどうもこんがらがっ
てしまいます。何かを追加するんでしょうか?

ハリィ 2003/10/27(月) 10:55:44
> それに自分で打ったし
自分で打てばOKということはありません。貴方の書いた文章を、他人が手入力したら、
その時点であなたの著作権は無視できるんですか?

> ソースは保護されないと思いましたが。
本の中に著作権表示などあるかもしれないので、もう一度よく読んでみることをオススメしま
す。

で、結局何が聞きたいんですか?音を出す方法ですか、それともいろいろな波形を作り出す
ための方程式ですか?

ゆうき 2003/10/27(月) 11:25:59
すいませんでした。まだまだ勉強不足でした。以後気をつけます。
音の方なんですが、単一の音じゃつまらないと思ったので色々な音を出したいのです。
つまり単一な音→正弦波、色々な音→違う波形ということなのでしょうか?
ちょっとした”ドレミ”レベルの音でいいので音の出し方をお願いします。

tib 2003/10/27(月) 12:42:04
> ちょっとした”ドレミ”レベルの音でいいので
サンプルプログラムは440Hzの音を作っているようですが、これは一般に「ラ」の音とさ
れています。この440Hzを「2の-1/12乗」だけ掛けると、半音上の音(この場合ラ#)の周波
数が得られます。半音2つ上の「シ」の周波数は「440 x 2の-2/12乗」です。こうやって
順次必要な音の周波数を求めて下さい。

古いスレッドには追加発言できません。