カラオケ化

「カラオケ化」の編集履歴(バックアップ)一覧はこちら

カラオケ化」(2013/05/02 (木) 21:58:53) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p> 完全ではありませんが .wav ファイルからボーカルを除去します。</p> <table width="600" border="1" cellpadding="1" cellspacing="1"><tbody><tr><td> <div>#include &lt;stdio.h&gt;</div> <div>#include &lt;stdlib.h&gt;</div> <div>#include &lt;string.h&gt;</div> <div>#include &lt;algorithm&gt;</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-&gt;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-&gt;channels;               // ch (mono=1, stereo=2)</div> <div> </div> <div>    wHdr.stWaveFormat.samplesPerSec=sp-&gt;samplesPerSec;     // sampleng rate(Hz)</div> <div> </div> <div>    bytes = sp-&gt;bitsPerSample / 8;                          // bytes/sec</div> <div>    wHdr.stWaveFormat.bytesPerSec=</div> <div>                bytes * sp-&gt;channels * sp-&gt;samplesPerSec;   // bytes / sec</div> <div> </div> <div>    wHdr.stWaveFormat.blockAlign=bytes * sp-&gt;channels;     // byte/サンプル*チャンネル</div> <div> </div> <div>    wHdr.stWaveFormat.bitsPerSample=sp-&gt;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-&gt;sizeOfData;                        // データ長 (byte)</div> <div> </div> <div>fwrite(&amp;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-&gt;bitsPerSample/8)*sp-&gt;channels;</div> <div> </div> <div>    for (i = 0; i &lt; sp-&gt;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-&gt;bitsPerSample/8)*sp-&gt;channels;</div> <div> </div> <div>    for (i = 0; i &lt; sp-&gt;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-&gt;posOfData, SEEK_SET);    //元ファイルのデータ開始部分へ</div> <div> </div> <div>    if(sp-&gt;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-&gt;FormatTag);</div> <div>    printf( "チャンネル数: %u\n", waveFmtPcm-&gt;Channels);</div> <div>    printf( "サンプリング周波数: %lu [Hz]\n", waveFmtPcm-&gt;SamplingRate);</div> <div>    printf( "バイト数 / 秒: %lu [bytes/sec]\n", waveFmtPcm-&gt;BytesPerSec);</div> <div>    printf( "バイト数×チャンネル数: %u [bytes]\n", waveFmtPcm-&gt;BlockAlign);</div> <div>    printf( "ビット数 / サンプル: %u [bits/sample]\n", waveFmtPcm-&gt;BitsPerSample);</div> <div> </div> <div>if(waveFmtPcm-&gt;Channels != 2)</div> <div>    {</div> <div>        printf( "\nこのプログラムはステレオのファイルを対象とします.\n");</div> <div>        printf( "このwavファイルのチャンネル数は %d です.\n", waveFmtPcm-&gt;Channels);</div> <div>        return false;</div> <div>    }</div> <div>    if(waveFmtPcm-&gt;FormatTag != 1)</div> <div>    {</div> <div>        printf( "\nこのプログラムは無圧縮PCMのみを対象とします.\n");</div> <div>        printf( "このwavファイルの形式は %04X です.\n", waveFmtPcm-&gt;FormatTag);</div> <div>        return false;</div> <div>    }</div> <div>    if(waveFmtPcm-&gt;BitsPerSample != 8 &amp;&amp; waveFmtPcm-&gt;BitsPerSample != 16)</div> <div>    {</div> <div>        printf( "\nこのプログラムは8/16ビットサンプリングされたものを対象とします\n");</div> <div>        printf( "このwavファイルの bits/secは %d です.\n", waveFmtPcm-&gt;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(&amp;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(&amp;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(&amp;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, &amp;waveFmtPcm))return false;</div> <div>sp-&gt;samplesPerSec=waveFmtPcm.SamplingRate;     // サンプリング周波数(Hz)</div> <div>sp-&gt;bitsPerSample=waveFmtPcm.BitsPerSample;     // サンプリングビット数</div> <div>sp-&gt;channels=waveFmtPcm.Channels;               // チャンネル数</div> <div>sp-&gt;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-&gt;sizeOfData=chank.FmtSize;</div> <div>            printf("\n\"data\" の長さ: %ld [bytes]\n", len);</div> <div>            fPos = ftell(fp);</div> <div>sp-&gt;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,&amp;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, &amp;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>

表示オプション

横に並べて表示:
変化行の前後のみ表示: