C言語関係掲示板

過去ログ

No.1187 au形式の簡単な音声ファイルを作るプログラム

[戻る] [ホームページ]
No.15514

波形データについて
投稿者---さかな(2004/07/14 17:48:15)


前に投稿させていただいた者です。何度もすみません。
Cで.au形式の簡単な音声ファイルを作るプログラムなのですが、
出力されたauファイルが開けません。
原因としては、このプログラムはbig endianのもので、
私のPCはlittle endianなので、開けないようです。
どなたか、big endianからlittle endianの変換の仕方を教えていただけないでしょうか?
ちなみにbig endianのプログラムです↓

#define MAXDATA 40000
#include <stdio.h>
#include <math.h>

typedef struct {
    int magic;
    int dataLocation;
    int dataSize;
    int dataFormat;
    int samplingRate;
    int channelCount;
    char info[4];
} SNDSoundStruct;

main(int argc, char *argv[]) {
    SNDSoundStruct hdr;
    FILE *fp;
    int frequency = 800;
    double step;
    int i;
    char x;
    
    if(argc != 2) {
        fprintf(stderr, "Usage: mysound <frequency>\n");
        exit(-1);
    }
    if (((frequency = atoi(argv[1])) <= 0) || (frequency > 4000)) {
        fprintf(stderr, "frequency should be between 0 to 4000 Hz\n");
        exit(-1);
    }
    
    fp = fopen("myfiling.au", "w");
   
    strcpy((char *)(&hdr.magic), "dns.");
    hdr.dataLocation = sizeof(hdr);
    hdr.dataSize = MAXDATA;
    hdr.dataFormat = 2;
    hdr.samplingRate = 8000;
    hdr.channelCount = 1;

    fwrite(&hdr, sizeof(hdr), 1, fp);
    for(i=0; i<MAXDATA; i++) {
        x = (char)(128.0 + 128.0 * sin(3.14 * 2 * frequency * i));
        fwrite(&x, 1, 1, fp);
    }

    fclose(fp);
}




No.15516

Re:波形データについて
投稿者---ぽへぇ(2004/07/14 19:19:08)


>どなたか、big endianからlittle endianの変換の仕方を教えていただけないでしょうか?
パソコン内部がlittle endianで、ファイルの書式がbig endianを
要求しているのですから、逆ですね。
little -> big の変換となります。
(まぁ、やることはそんなに大して変わりませんが)

ヒント:
 シフト演算子 と ビットごとの演算子

あと、細かい所に突っ込むと   
>    fp = fopen("myfiling.au", "w");
移植性を考えるのなら、"b" を付けてバイナリモードでopenした方が良いと思います。

>        x = (char)(128.0 + 128.0 * sin(3.14 * 2 * frequency * i));
これは音が鳴ることは鳴るかもしれませんが、意図した音にならないでしょう。




No.15518

Re:波形データについて
投稿者---さかな(2004/07/14 20:30:59)


レスありがとうございます。
ヒントなどを見てやりたいことはわかったのですが、
馬鹿なのでどうC言語で表現していいのかがわかりません。
もう少し、ヒントをいただけるとありがたいのですが。


No.15521

Re:波形データについて
投稿者---.(2004/07/14 20:49:35)


http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200407/04070021.txt


No.15523

Re:波形データについて
投稿者---.(2004/07/14 21:18:01)


>もう少し、ヒントをいただけるとありがたいのですが。
http://www9.plala.or.jp/sgwr-t/c/sec14.html



No.15593

Re:波形データについて
投稿者---ぽへぇ(2004/07/16 20:00:23)


>もう少し、ヒントをいただけるとありがたいのですが。
ヒントその2:

準備:
過去ログ
    http://f1.aaa.livedoor.jp/~pointc/log723.html
を読みなさい。

あなたの計算機の内部でunsigned longが4バイト(以上)だと仮定します。

練習問題1:
unsigned long x = 0x12345678;
x を シフト演算を使って x = 0x00000012 にしなさい。

練習問題2:
unsigned long x = 0x12345678;
x を &演算子を使って x = 0x00340000 にしなさい。
さらにシフトを使って x = 0x00003400 にしなさい。

練習問題3:
unsigned long x = 0x12345678;
x を &演算子を使って x = 0x00005600 にしなさい。
さらにシフトを使って x = 0x00560000 にしなさい。

練習問題4は自分で作って、自分で解いてください。^^;

練習問題5:
練習問題1〜4で得た答を足したらどうなりますか?

これでわからなければ、
http://www9.plala.or.jp/sgwr-t/c/sec14.html
からやりなおしてください。



No.15596

Re:波形データについて
投稿者---さかな(2004/07/16 22:42:35)


ありがとうございます!
何とか、エンディアン変換できました。
ほんとうにありがとうございました。


No.15621

Re:波形データについて
投稿者---さかな(2004/07/17 18:54:35)


すみません。もう一ついいですか?
x = (char)(128.0 + 128.0 * sin(3.14 * 2 * frequency * i));
の形はよくないとご指摘を頂きましたが、何がよくないか教えていただけないでしょうか?


No.15626

Re:波形データについて
投稿者---ぽへぇ(2004/07/17 22:18:08)


>すみません。もう一ついいですか?
> x = (char)(128.0 + 128.0 * sin(3.14 * 2 * frequency * i));
>の形はよくないとご指摘を頂きましたが、何がよくないか
>教えていただけないでしょうか?
今の形で意図した音が出てるんですか?



No.15629

Re:波形データについて
投稿者---さかな(2004/07/17 22:45:40)


はい。普通の純音でしたが音は出ました。


No.15645

Re:波形データについて
投稿者---ぽへぇ(2004/07/18 18:54:33)


>はい。普通の純音でしたが音は出ました。

「純音」という言葉をご存知なら私の思い過ごし
だとは思いますが。

http://www5.ocn.ne.jp/~dgb/12Freq.htm を参照後、
mysound 440 を実行させて、身近にある楽器と比べてください。



No.15646

Re:波形データについて
投稿者---さかな(2004/07/18 19:15:37)


おっしゃるとおりにやってみましたが、
440Hzはラの音が出るはずですよね?
ピアノで試してみましたが、ラの音は出ませんでした。
どうやら純音ではなかったようです。私の勘違いでした。
x = (char)(128.0 + 128.0 * sin(3.14 * 2 * frequency * i));
という式は間違っているようですね。


No.15653

Re:波形データについて
投稿者---ぽへぇ(2004/07/19 08:09:48)


>ピアノで試してみましたが、ラの音は出ませんでした。
    :
>間違っているようですね。

ということで「意図した音にはならない」と指摘させていただきました。
さかなさん 自身が直せるところかもしれませんので、
これ以上の書き込みは遠慮させていただきます。

(もっと言うと、第一項の 128.0+ も係数の 128.0* も変です。)



No.15656

Re:波形データについて
投稿者---さかな(2004/07/19 10:25:04)


何とか自分で直し、純音が出ました!
ぽへぇさんありがとうございました!!