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) |
||
何とか自分で直し、純音が出ました! ぽへぇさんありがとうございました!! |