...
一応答えておきますが、
(多分)winmm.libをリンクライブラリに追加しましょう。
PAIさんが言うとおりですが、もう少し説明追加させてください
>外部シンボル __imp__mmioAscend@12 は未解決です
のうちの”__imp__”を除いた”@”前までをキーワードに
MSDNを検索すると
”mmioAscend”について検索することができ
その説明には
>対応情報
> Windows NT/2000:Windows NT 3.1 以降
> Windows 95/98:Windows 95 以降
> ヘッダー:mmsystem.h 内で宣言
> インポートライブラリ:winmm.lib を使用
となっています
もっとMSDN活用してください
いや、多分リンクエラーというものがなんなのか理解されてないと思う。
MMSYSTEMをつかって、WAVEFORMAT構造体で最初はWAVEFORMATEXを使って作ったのです
が、拡張サイズも含まれて書き込みされてしまうため、PCMWAVEFORMATを使ってプログラ
ムをしています。
typedef struct pcmwaveformat_tag {
WAVEFORMAT wf;
WORD wBitsPerSample;
} PCMWAVEFORMAT
このようなプログラムがMMSYSTEM.Hには書かれている部分がありますが、WAVEFORMAT処
理させるにはどうしたらいいのでしょうか??WFをどのように書込んだらしたの下記の
処理の値が書込まれるのでしょうか??
typedef struct waveformat_tag {
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo, etc.) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
} WAVEFORMAT
現状は、RIFF、WAVEサイズ、WAVE、FMT、間で書込んだら00が入り量子化だけ値が書込ま
れてしまいました。
リンクエラーはどうなりました?
>WAVEFORMAT構造体で最初はWAVEFORMATEXを使って作ったのです
> が、拡張サイズも含まれて書き込みされてしまうため、
拡張サイズは任意なので、値を0にして書き出してもかまいませんし
面倒であれば、書き出す必要もありません。
拡張サイズを省略するかしないかでこの構造体のサイズが
16 or 18 バイトになるのでそれだけ理解してくれれば問題ないかと。
注意しないと行けないのは、その前に書き出す WAVEFORMATEX の
サイズと同じサイズにするのが重要です。
>WFをどのように書込んだらしたの下記の処理の値が書込まれるのでしょうか??
typedef struct waveformat_tag {
WORD wFormatTag; /* これは PCM_FORMAT です。 */
WORD nChannels; /* 1の場合モノラル、2の場合ステレオです。 */
DWORD nSamplesPerSec; /* サンプリング周波数を入れます */
DWORD nAvgBytesPerSec; /* */
WORD nBlockAlign; /* 量子化バイト数です。bit じゃないので注意*/
} WAVEFORMAT
nAvgBytesPerSec は 平均秒間データ転送バイト数です。求め方は
nAvgBytesPerSec = nSamplesPerSec * nChannels * nBlockAlign;
です。
前にもいったように nChannels, nSamplesPerSec , nBlockAlign
の3つの値が決まっていないとファイルへの書き出しができません。貴方の
返答がないのでこの辺はいまいち分からないのですが、この3つの変数が
分からない限り WAVE ファイルを作るのは絶対に不可能です。
あと、大変申し訳ない、どうも mmio を使って書き出すと面倒の模様です。
読み込みの時は便利なんですが、書き出した順番に数行程を書き出すだけ
良いので、そのまま書き出した方がシンプルの様です。
一番下の方に書き出しをするサンプルがあります。ただ、VCじゃないので
書き直しが多少必要ですが。
http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-061.html
>現状は、RIFF、WAVEサイズ、WAVE、FMT、間で書込んだら00が入り量子化
>だけ値が書込まれてしまいました。
その部分のコードをみせてもらわないとちょっとわかりかねません。
>わかりかねません。
わかりかねます・・・・わからない
わかりかねません・・・わかる
日本語って難しい。
WAVEの構造体の作成は完成しました。
しかし、波形データを読込んで出力ファイルに書込むことができません。
一応以下に波形データを処理させるプログラムの一部を記載します。
SetFilePointer( m_hMio , 44 , NULL ,FILE_END);
// 出力ファイルに構造体を書込んだ終端のファイルポインタを0とする
CStdioFile nFile,sFile;
CString data;
nFile.Open( FilenameN , CFile::modeRead | CFile::modeNoTruncate );
nFile.ReadString(data);
// 入力ファイルからデータを一つ取り出す(一行で一つのデータと考える)
CString dataI = data.Mid(0,6); // 情報の取得
numI = atoi(dataI); // CString ⇒ int
dataI = ( numI ) / 256 + 128;
// 成分を補正する(-32768~32767)→(0~255)へ変換
CStdioFile sFile( FilenameS , CFile::modeReadWrite | CFile::modeNoTruncate |
CFile::typeText);
sFile.WriteString(dataI);
書込むところが悪いようにおもうのですが・・・
>CString dataI = data.Mid(0,6); // 情報の取得
>numI = atoi(dataI); // CString ⇒ int
>dataI = ( numI ) / 256 + 128;
CString型 = int型の計算 これでコンパイル通るの?
char型 = int型の計算 ならたまに使うけど。
>今、あるテキストファイルから音声ファイルを作成するプログラムを作っています。
音声ファイルがなんでCStdioFileなの?
>書込むところが悪いようにおもうのですが・・・
そのとおり
>音声ファイル
て!
改行コード付のテキストファイルだったんですか?
しりませんでした~!
>dataI
もバイナリーデータではなく文字列だったんですか
>dataI = ( numI ) / 256 + 128;
この計算式の括弧って特別ないみあるんでしょうな~
参考のためおしえてくださいよ~
ま! こんなの答える気にならないし参考にならないと思うんでしょうけど
ここでいっていることは「??? さん」とほぼ一緒ですよ
質問の内容がはっきりと書かれていないように思います。
それと、ちゃんと一行ずつデバッグしてますか?
CString data = 0x5265ABFF;
CString data1 = data.Mid(0,6);
1行のデータを読込むのに、Joanさんの言われたとおりの方法でデバックをしてみたと
ころ、16進数の値を読込むことができました。
成分を補正する(-32768~32767)→(0~255)へ変換処理を行うところで、16進数の値を
読込むことができませんでした。
WAVEフォーマットの情報はMMIOを使って書込むことができました。
しかしながら、0x65654564という情報をまだ書込むことができません。
何かいいアドバイスがあれば教えてください
検索するといろいろみつかりました。
http://cgi.members.interq.or.jp/gold/marken/vc/old/msg2725.htm
strtol();
使い方
int value;
CString str = 0x0ac4;
char *end;
value = (int)strtol(str,&end,16);
endがNULLだったら正常で、NULL以外なら認識できなかった文字へのポインタが
入ります。
16は基数です。
そのほか
16進->10進変換
http://www.geocities.jp/dolanpura/vctips/math/hex2int.htm
char(16進)から、int(10進)変換
http://home.att.ne.jp/blue/hira/program01.html#15
It can not continue yet the question contents ?
FILE *fopen( const char *filename, const char *mode );
size_t fwrite( const void*buffer, size_t size, size_t count, FILE *stream );
-------------------------------------------------------------
FILE *FP1;
WORD D_WORD;
FP1=fopen( AAA.WAV”, ”a+b );
D_WORD=0x65654564;
fwrite( D_WORD, sizeof(D_WORD), 1,FP1);
fclose(FP1);
----------------------------------------------------------------
How is it with such a feeling
I will reply to the question of everybody neatly
一応結果が出力されました。
まだ二つのミスがあります。
一つは、読み込みをCStdioFileで読込んでいるのですが、データがなくなったかを調べ
るにはどのようにしたらいいのでしょうか??
あと、出力で「0x75850001」というデータを読込んで処理した結果が、85 75 01 00とい
うように出力させるにはどうしたらいいのでしょうか??