「モノラル化」の編集履歴(バックアップ)一覧はこちら
「モノラル化」(2013/03/03 (日) 15:02:26) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<div><strong>ステレオWAVファイルからモノラルのWAVファイルにします。</strong></div>
<div><strong>左チャンネルのみと右チャンネルのみ、左右のチャンネルを</strong></div>
<div><strong>mixしたものを一度に作成します。</strong></div>
<table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td>
<div>#include <stdio.h></div>
<div>#include <string.h></div>
<div> </div>
<div>#define FileName "Warp1_ste.wav" //適当な曲を探して下さい。</div>
<div> </div>
<div>// defines</div>
<div>#define STR_RIFF "RIFF"</div>
<div>#define STR_WAVE "WAVE"</div>
<div>#define STR_fmt "fmt "</div>
<div>#define STR_data "data"</div>
<div> </div>
<div>#define WAV_MONAURAL 1</div>
<div>#define WAV_STEREO 2</div>
<div> </div>
<div>#pragma pack(push,1)</div>
<div>struct WaveFileHeader{</div>
<div> char Riff[4]; // RIFFヘッダ</div>
<div> unsigned int FileSize; // ファイルサイズ - 8</div>
<div> char Wave[4]; // WAVEヘッダ</div>
<div>};</div>
<div> </div>
<div>struct TagChank{</div>
<div> unsigned char Fmt[4]; // fmt チャンク</div>
<div> unsigned int FmtSize; // fmt チャンクのバイト数</div>
<div>};</div>
<div> </div>
<div>struct WaveFormat{</div>
<div> unsigned short FormatTag; // フォーマットID</div>
<div> unsigned short Channels; // チャンネル数</div>
<div> unsigned int SamplingRate; // サンプリングレート</div>
<div> unsigned int BytesPerSec; // データ速度 (Byte/sec)</div>
<div> unsigned short BlockAlign; // ブロックサイズ</div>
<div> unsigned short BitsPerSample; // サンプルあたりのビット数</div>
<div>};</div>
<div> </div>
<div>struct tagWrSWaveFileHeader</div>
<div>{</div>
<div> unsigned char hdrRiff[4]; // 'RIFF'</div>
<div> unsigned int sizeOfFile; // ファイルサイズ - 8</div>
<div> unsigned char hdrWave[4]; // 'WAVE'</div>
<div> unsigned char hdrFmt[4]; // 'fmt '</div>
<div> unsigned int sizeOfFmt; // sizeof( PCMWAVEFORMAT )</div>
<div> struct {</div>
<div> unsigned short formatTag; // WAVE_FORMAT_PCM</div>
<div> unsigned short channels; // number of channels</div>
<div> unsigned int samplesPerSec; // sampling rate</div>
<div> unsigned int bytesPerSec; // samplesPerSec * channels *
(bitsPerSample/8)</div>
<div> unsigned short blockAlign; // block align</div>
<div> unsigned short bitsPerSample; // bits per sampling</div>
<div> } stWaveFormat; // PCMWAVEFORMAT</div>
<div> unsigned char hdrData[4]; // 'data'</div>
<div> unsigned int sizeOfData; // Waveデーターサイズ</div>
<div>};</div>
<div>#pragma pack(pop)</div>
<div> </div>
<div>WaveFileHeader waveFileHeader;</div>
<div>WaveFormat waveFmtPcm;</div>
<div>TagChank chank;</div>
<div> </div>
<div>//8 bits/sampling</div>
<div> </div>
<div>int efffect8BitWav(FILE *fpIn, FILE *fpOut, long sizeOfData, int LR)</div>
<div>{</div>
<div> unsigned int i;</div>
<div> unsigned short mix;</div>
<div> unsigned char In[2];</div>
<div> unsigned char Out;</div>
<div> </div>
<div> for (i = 0; i < sizeOfData / sizeof In; i++)</div>
<div> {</div>
<div> if(fread( In, sizeof In, 1, fpIn) != 1)</div>
<div> return -1;</div>
<div> </div>
<div>if(LR==2){</div>
<div>mix = ((unsigned short)In[0] +(unsigned short)In[1]) / (unsigned
short)2;</div>
<div> Out=(unsigned char)mix;</div>
<div> </div>
<div> if(fwrite(&Out, sizeof Out, 1, fpOut) != 1)</div>
<div> return -1;</div>
<div>}else{</div>
<div> if (fwrite(In, sizeof In[LR], 1, fpOut) != 1)</div>
<div> return -1;</div>
<div>}</div>
<div> }</div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div> </div>
<div>// 16 bits/sampling</div>
<div>int efffect16BitWav(FILE *fpIn, FILE *fpOut, long sizeOfData, int
LR)</div>
<div>{</div>
<div> unsigned int i;</div>
<div> int mix;</div>
<div> short In[2];</div>
<div> short Out;</div>
<div> </div>
<div> for (i = 0; i < sizeOfData / sizeof In; i++)</div>
<div> {</div>
<div> if(fread( In, sizeof In, 1, fpIn) != 1)</div>
<div> return -1;</div>
<div> </div>
<div>if(LR==2){</div>
<div> mix = ((int)In[0] +(int)In[1]) / (int)2;</div>
<div> Out=(short)mix;</div>
<div> </div>
<div> if(fwrite(&Out, sizeof Out, 1, fpOut) != 1)</div>
<div> return -1;</div>
<div>}else{</div>
<div> </div>
<div> if (fwrite(In, sizeof In[LR], 1, fpOut) != 1)</div>
<div> return -1;</div>
<div>}</div>
<div> }</div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div> </div>
<div> </div>
<div>// wav ヘッダ 書き込み</div>
<div>long wavHeaderWrite(FILE *fp, long sizeOfData, unsigned short ch, unsigned
long sampRate, unsigned short sampBits)</div>
<div>{</div>
<div> unsigned short bytes;</div>
<div> tagWrSWaveFileHeader wrWavHdr;</div>
<div> </div>
<div> strncpy((char *)wrWavHdr.hdrRiff,STR_RIFF,sizeof wrWavHdr.hdrRiff); //
RIFF ヘッダ</div>
<div> </div>
<div> wrWavHdr.sizeOfFile=sizeOfData + sizeof(wrWavHdr) - 8; //
ファイルサイズ</div>
<div> </div>
<div> strncpy((char *)wrWavHdr.hdrWave,STR_WAVE,sizeof wrWavHdr.hdrWave); //
WAVE ヘッダ</div>
<div> </div>
<div> strncpy((char *)wrWavHdr.hdrFmt,STR_fmt,sizeof wrWavHdr.hdrFmt); //
fmt チャンク</div>
<div> </div>
<div> wrWavHdr.sizeOfFmt= sizeof wrWavHdr.stWaveFormat; // fmt
チャンク,無圧縮wav は 16</div>
<div> </div>
<div> wrWavHdr.stWaveFormat.formatTag=1; // 無圧縮PCM
= 1</div>
<div> </div>
<div> wrWavHdr.stWaveFormat.channels=ch; // ch
(mono=1, stereo=2)</div>
<div> </div>
<div> wrWavHdr.stWaveFormat.samplesPerSec=sampRate; //
sampleng rate(Hz)</div>
<div> </div>
<div> bytes = sampBits / 8; //
bytes/sec</div>
<div> wrWavHdr.stWaveFormat.bytesPerSec = bytes * ch * sampRate;</div>
<div> </div>
<div> wrWavHdr.stWaveFormat.blockAlign=bytes * ch; //
byte/サンプル*チャンネル</div>
<div> </div>
<div> wrWavHdr.stWaveFormat.bitsPerSample=sampBits; //
bit/サンプル</div>
<div> </div>
<div> strncpy((char *)wrWavHdr.hdrData,STR_data,sizeof wrWavHdr.hdrData); //
dataチャンク</div>
<div> </div>
<div> wrWavHdr.sizeOfData=sizeOfData; // データ長
(byte)</div>
<div> </div>
<div> fwrite(&wrWavHdr, sizeof wrWavHdr, 1, fp); //
write header</div>
<div> </div>
<div> return ftell(fp);</div>
<div>}</div>
<div> </div>
<div> </div>
<div>// wav データ書き込み</div>
<div>int wavDataWrite(FILE *fpIn, FILE *fpOut, long posOfData,long sizeOfData,
short bytesPerSingleCh, int LR)</div>
<div>{</div>
<div> fseek(fpIn, posOfData, SEEK_SET); //元ファイルのデータ開始部分へ</div>
<div> </div>
<div>if( bytesPerSingleCh==1){</div>
<div> return efffect8BitWav(fpIn, fpOut, sizeOfData, LR);</div>
<div>}else{</div>
<div> return efffect16BitWav(fpIn, fpOut, sizeOfData, LR);</div>
<div>}</div>
<div>}</div>
<div> </div>
<div>// ファイル内容書き出し</div>
<div>int wavWrite(char *inFile, char *outFile, unsigned long sampRate, unsigned
short sampBits, long posOfData, long sizeOfData, int LR)</div>
<div>{</div>
<div> unsigned short bytesPerSingleCh;</div>
<div> FILE *fpIn, *fpOut;</div>
<div> </div>
<div> if((fpOut = fopen(outFile, "wb")) == NULL)</div>
<div> {</div>
<div> fprintf(stderr, "%s をオープンできません.\n", outFile);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> bytesPerSingleCh = sampBits / 8;</div>
<div> </div>
<div> // wav ヘッダ書き込み</div>
<div> if(wavHeaderWrite(fpOut, sizeOfData/2, WAV_MONAURAL, sampRate,
sampBits) != 44)</div>
<div> {</div>
<div> fprintf(stderr, "ヘッダを書き込めません: %s\n", outFile);</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> if((fpIn = fopen(inFile, "rb")) == NULL)</div>
<div> {</div>
<div> fprintf(stderr, "%s をオープンできません.\n", inFile);</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> // wav データ書き込み</div>
<div> if(wavDataWrite(fpIn, fpOut, posOfData, sizeOfData, bytesPerSingleCh,
LR)!=0)</div>
<div> {</div>
<div> fprintf(stderr, "wavDataWriteでエラー発生.\n");</div>
<div> fclose(fpIn);</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> fclose(fpIn);</div>
<div> fclose(fpOut);</div>
<div> </div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div> </div>
<div>bool readfmtChunk(FILE *fp, WaveFormat* waveFmtPcm){</div>
<div> if(fread(waveFmtPcm, sizeof(WaveFormat), 1, fp) != 1)return
false;</div>
<div> </div>
<div> printf( "データ形式: %u (1 = PCM)\n", waveFmtPcm->FormatTag);</div>
<div> printf( "チャンネル数: %u\n", waveFmtPcm->Channels);</div>
<div> printf( "サンプリング周波数: %lu [Hz]\n", waveFmtPcm->SamplingRate);</div>
<div> printf( "バイト数 / 秒: %lu [bytes/sec]\n",
waveFmtPcm->BytesPerSec);</div>
<div> printf( "バイト数×チャンネル数: %u [bytes]\n", waveFmtPcm->BlockAlign);</div>
<div> printf( "ビット数 / サンプル: %u [bits/sample]\n",
waveFmtPcm->BitsPerSample);</div>
<div> </div>
<div>if(waveFmtPcm->Channels != 2)</div>
<div> {</div>
<div> printf( "\nこのプログラムはステレオのファイルを対象とします.\n");</div>
<div> printf( "このwavファイルのチャンネル数は %d です.\n",
waveFmtPcm->Channels);</div>
<div> return false;</div>
<div> }</div>
<div> if(waveFmtPcm->FormatTag != 1)</div>
<div> {</div>
<div> printf( "\nこのプログラムは無圧縮PCMのみを対象とします.\n");</div>
<div> printf( "このwavファイルの形式は %04X です.\n",
waveFmtPcm->FormatTag);</div>
<div> return false;</div>
<div> }</div>
<div> if(waveFmtPcm->BitsPerSample != 8 &&
waveFmtPcm->BitsPerSample != 16)</div>
<div> {</div>
<div> printf( "\nこのプログラムは8/16ビットサンプリングされたものを対象とします\n");</div>
<div> printf( "このwavファイルの bits/secは %d です.\n",
waveFmtPcm->BitsPerSample);</div>
<div> return false;</div>
<div> }</div>
<div> return true;</div>
<div>}</div>
<div> </div>
<div> </div>
<div> </div>
<div>bool WaveHeaderRead(char *wavefile){</div>
<div> long fPos, len;</div>
<div> FILE *fp;</div>
<div>errno_t err;</div>
<div> </div>
<div> if (err=fopen_s(&fp,wavefile, "rb") !=0){</div>
<div> printf(" %sをオープンできません\n", wavefile);</div>
<div> return false;</div>
<div> }</div>
<div> printf( "\n%s :\n", wavefile);</div>
<div> </div>
<div> // ヘッダ情報</div>
<div> if (fread(&waveFileHeader, sizeof waveFileHeader, 1, fp) !=
1){</div>
<div> printf(" %ld で読み込み失敗\n", ftell(fp));</div>
<div> fclose(fp);</div>
<div> return false;</div>
<div> }</div>
<div> </div>
<div>if(strncmp( waveFileHeader.Riff, "RIFF", 4) != 0){</div>
<div> printf("'RIFF' フォーマットでない\n");</div>
<div> fclose(fp);</div>
<div> return false;</div>
<div> }</div>
<div> </div>
<div> // WAVE ヘッダ情報</div>
<div>if (memcmp(waveFileHeader.Wave, "WAVE", 4) != 0){</div>
<div> printf("'WAVE' が無い\n");</div>
<div> fclose(fp);</div>
<div> return false;</div>
<div> }</div>
<div> </div>
<div> // 4Byte これ以降のバイト数 = (ファイルサイズ - 8)(Byte)</div>
<div>len = waveFileHeader.FileSize;</div>
<div> </div>
<div> // チャンク情報</div>
<div> while (fread(&chank, sizeof chank, 1, fp) == 1){</div>
<div>if(memcmp( chank.Fmt, "fmt ", sizeof chank.Fmt) == 0){</div>
<div> len=chank.FmtSize;</div>
<div> printf("\"fmt \"の長さ: %ld [bytes]\n\n", len);</div>
<div> fPos = ftell(fp);</div>
<div> if(! readfmtChunk( fp, &waveFmtPcm))return false;</div>
<div> fseek(fp, fPos + len, SEEK_SET);</div>
<div> }else if(memcmp(chank.Fmt, "data", 4) == 0){</div>
<div> len = chank.FmtSize;</div>
<div> printf("\n\"data\" の長さ: %ld [bytes]\n", len);</div>
<div> fPos = ftell(fp);</div>
<div> fseek(fp, len + fPos - 4, SEEK_SET);</div>
<div> break;</div>
<div> }else{</div>
<div> len=chank.FmtSize;</div>
<div> printf( "\"%c%c%c%c\"の長さ: %ld [bytes]\n\n",</div>
<div>chank.Fmt[0],chank.Fmt[1],</div>
<div>chank.Fmt[2],chank.Fmt[3], len);</div>
<div> fPos = ftell(fp);</div>
<div> fseek(fp, fPos + len, SEEK_SET);</div>
<div> }</div>
<div> }</div>
<div> fclose(fp);</div>
<div> </div>
<div> return true;</div>
<div>}</div>
<div> </div>
<div> </div>
<div>void main(int argc, char *argv[]){</div>
<div> WaveHeaderRead(FileName);</div>
<div> </div>
<div>//0=L 1=R 2=mix</div>
<div>if( wavWrite(FileName, "monoL.wav", waveFmtPcm.SamplingRate,
waveFmtPcm.BitsPerSample, 0, waveFileHeader.FileSize,0)!=0)</div>
<div> return;</div>
<div>if( wavWrite(FileName, "monoR.wav", waveFmtPcm.SamplingRate,
waveFmtPcm.BitsPerSample, 0, waveFileHeader.FileSize,1)!=0)</div>
<div> return;</div>
<div>if( wavWrite(FileName, "monoM.wav", waveFmtPcm.SamplingRate,
waveFmtPcm.BitsPerSample, 0, waveFileHeader.FileSize,2)!=0)</div>
<div> return;</div>
<div>getchar();</div>
<div>}</div>
<div> </div>
</td>
</tr></tbody></table><p> </p>
<p> </p>
<p> </p>