「カラオケ化」の編集履歴(バックアップ)一覧はこちら
「カラオケ化」(2013/05/02 (木) 21:58:53) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p> 完全ではありませんが .wav ファイルからボーカルを除去します。</p>
<table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td>
<div>#include <stdio.h></div>
<div>#include <stdlib.h></div>
<div>#include <string.h></div>
<div>#include <algorithm></div>
<div> </div>
<div>using namespace std;</div>
<div> </div>
<div>#define INFileName "sound.wav"</div>
<div>#define OUTFileName "karaoke.wav"</div>
<div>#define PAI 3.141592653589793</div>
<div>#define Length 3.00</div>
<div> </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 WrSWaveFileHeader</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> </div>
<div>//関数間の引数</div>
<div>struct TagParam</div>
<div>{</div>
<div> unsigned int sizeOfData; // Waveデーターサイズ</div>
<div> unsigned short channels; // チャンネル数</div>
<div> unsigned int samplesPerSec; // Hz</div>
<div> unsigned int bytesPerSec; // バイト数/sec</div>
<div> unsigned short bitsPerSample; // 8 bits or 16 bits</div>
<div> long posOfData; // position of begnning of WAV
datas</div>
<div>float secPerCycle; // 間隔:秒</div>
<div> long cycleuSec; // 間隔:μ秒</div>
<div>float fAmp; // ボリューム倍率</div>
<div>};</div>
<div>#pragma pack(pop)</div>
<div> </div>
<div>WaveFileHeader waveFileHeader;</div>
<div>WaveFormat waveFmtPcm;</div>
<div>TagChank chank;</div>
<div>TagParam sp;</div>
<div> </div>
<div>// wav ヘッダ作成</div>
<div>long wavHeaderWrite(FILE *fp, TagParam* sp)</div>
<div>{</div>
<div> unsigned short bytes;</div>
<div>WrSWaveFileHeader wHdr;</div>
<div> </div>
<div> strncpy((char *)wHdr.hdrRiff,STR_RIFF,sizeof wHdr.hdrRiff); // RIFF
ヘッダ</div>
<div> </div>
<div> wHdr.sizeOfFile=sp->sizeOfData+sizeof(WrSWaveFileHeader)-8;//
ファイルサイズ</div>
<div> </div>
<div> strncpy((char *)wHdr.hdrWave,STR_WAVE,sizeof wHdr.hdrWave); // WAVE
ヘッダ</div>
<div> </div>
<div> strncpy((char *)wHdr.hdrFmt,STR_fmt,sizeof wHdr.hdrFmt); // fmt
チャンク</div>
<div> </div>
<div> wHdr.sizeOfFmt=sizeof wHdr.stWaveFormat; // fmt
チャンク,無圧縮wav は 16</div>
<div> </div>
<div> wHdr.stWaveFormat.formatTag=1; // 無圧縮PCM =
1</div>
<div> </div>
<div> wHdr.stWaveFormat.channels=sp->channels; // ch
(mono=1, stereo=2)</div>
<div> </div>
<div> wHdr.stWaveFormat.samplesPerSec=sp->samplesPerSec; // sampleng
rate(Hz)</div>
<div> </div>
<div> bytes = sp->bitsPerSample / 8; //
bytes/sec</div>
<div> wHdr.stWaveFormat.bytesPerSec=</div>
<div> bytes * sp->channels * sp->samplesPerSec; // bytes
/ sec</div>
<div> </div>
<div> wHdr.stWaveFormat.blockAlign=bytes * sp->channels; //
byte/サンプル*チャンネル</div>
<div> </div>
<div> wHdr.stWaveFormat.bitsPerSample=sp->bitsPerSample; // 16 bit /
sample</div>
<div> </div>
<div> strncpy((char *)wHdr.hdrData,STR_data,sizeof wHdr.hdrData); //
dataチャンク</div>
<div> </div>
<div> wHdr.sizeOfData=sp->sizeOfData; // データ長
(byte)</div>
<div> </div>
<div>fwrite(&wHdr, sizeof wHdr, 1, fp); // write
header</div>
<div> </div>
<div>return ftell(fp);</div>
<div>}</div>
<div> </div>
<div> </div>
<div>// 8 bits/sampling</div>
<div> </div>
<div>int efffect8BitWav(FILE *fpIn, FILE *fpOut, TagParam* sp)</div>
<div>{</div>
<div> unsigned int i;</div>
<div> unsigned char In[2];</div>
<div> int tmpL,tmpR,L,R;</div>
<div> </div>
<div> long oneSampleData=(sp->bitsPerSample/8)*sp->channels;</div>
<div> </div>
<div> for (i = 0; i < sp->sizeOfData / oneSampleData ; i++)</div>
<div> {</div>
<div> if(fread( In, sizeof In, 1, fpIn) != 1)</div>
<div> return -1;</div>
<div> </div>
<div> tmpL=In[0]-128;</div>
<div> tmpR=In[1]-128;</div>
<div> L=tmpL-tmpR;</div>
<div> R=tmpR-tmpL;</div>
<div> L=max(-128,min(127,L));</div>
<div> R=max(-128,min(127,R));</div>
<div> In[0]=(unsigned char)(L+128);</div>
<div> In[1]=(unsigned char)(R+128);</div>
<div> </div>
<div> if (fwrite(In, sizeof In, 1, fpOut) != 1)</div>
<div> return -1;</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, TagParam* sp)</div>
<div>{</div>
<div>unsigned int i;</div>
<div> short In[2];</div>
<div> int L,R;</div>
<div> </div>
<div> long oneSampleData=(sp->bitsPerSample/8)*sp->channels;</div>
<div> </div>
<div> for (i = 0; i < sp->sizeOfData / oneSampleData ; i++)</div>
<div> {</div>
<div> if(fread( In, sizeof In, 1, fpIn) != 1)</div>
<div> return -1;</div>
<div> </div>
<div> L=(int)In[0]-(int)In[1];</div>
<div> R=(int)In[1]-(int)In[0];</div>
<div> L=max(-32768,min(32767,L));</div>
<div> R=max(-32768,min(32767,R));</div>
<div> In[0]=(short)L;</div>
<div> In[1]=(short)R;</div>
<div> </div>
<div> </div>
<div> if (fwrite(In, sizeof In, 1, fpOut) != 1)</div>
<div> return -1;</div>
<div> }</div>
<div> return 0;</div>
<div>}</div>
<div> </div>
<div> </div>
<div>//wav データ書き込み</div>
<div>int wavDataWrite(FILE *fpIn, FILE *fpOut, TagParam* sp)</div>
<div>{</div>
<div> int rVal;</div>
<div> </div>
<div> fseek(fpIn, sp->posOfData, SEEK_SET); //元ファイルのデータ開始部分へ</div>
<div> </div>
<div> if(sp->bitsPerSample==8)</div>
<div> rVal=efffect8BitWav(fpIn, fpOut, sp);</div>
<div> else</div>
<div> rVal=efffect16BitWav(fpIn, fpOut, sp);</div>
<div> </div>
<div> return rVal;</div>
<div>}</div>
<div> </div>
<div> </div>
<div>// ファイル内容書き出し</div>
<div>int wavWrite(char *inFile, char *outFile, TagParam* sp)</div>
<div>{</div>
<div> FILE *fpIn, *fpOut;</div>
<div> </div>
<div> if((fpOut = fopen(outFile, "wb")) == NULL)</div>
<div> {</div>
<div> printf("%s をオープンできません.\n", outFile);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> if(wavHeaderWrite(fpOut, sp) != 44) // wav ヘッダ書き込み</div>
<div> {</div>
<div> printf("ヘッダを書き込めません: %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> printf("%s をオープンできません.\n", inFile);</div>
<div> fclose(fpOut);</div>
<div> return -1;</div>
<div> }</div>
<div> </div>
<div> if(wavDataWrite(fpIn, fpOut, sp )!=0) // wav データ書き込み</div>
<div> {</div>
<div> printf("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>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, TagParam* sp){</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>sp->samplesPerSec=waveFmtPcm.SamplingRate; // サンプリング周波数(Hz)</div>
<div>sp->bitsPerSample=waveFmtPcm.BitsPerSample; // サンプリングビット数</div>
<div>sp->channels=waveFmtPcm.Channels; // チャンネル数</div>
<div>sp->bytesPerSec=waveFmtPcm.BytesPerSec; // バイト数/sec</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>sp->sizeOfData=chank.FmtSize;</div>
<div> printf("\n\"data\" の長さ: %ld [bytes]\n", len);</div>
<div> fPos = ftell(fp);</div>
<div>sp->posOfData=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>void main(int argc, char *argv[]){</div>
<div> </div>
<div> </div>
<div>sp.secPerCycle=Length; </div>
<div> </div>
<div> WaveHeaderRead(INFileName,&sp);</div>
<div> </div>
<div>if(sp.channels==1)</div>
<div> {</div>
<div> printf("\n入力ファイルはステレオでなければなりません.\n");</div>
<div> return;</div>
<div> }</div>
<div> </div>
<div> wavWrite(INFileName , OUTFileName, &sp);</div>
<div> </div>
<div> printf("\n%s を %sへ変換しました.\n", INFileName, OUTFileName);</div>
<div>getchar();</div>
<div> return;</div>
<div>}</div>
</td>
</tr></tbody></table><p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>