Giter Club home page Giter Club logo

sound-effect's Introduction

                              このフォルダの内容について
                                                        平成24年10月26日
                                                              小坂直敏

 このフォルダには、本文で説明しているプログラムのソースコードを中心に関連する
ファイルを載せている。また、32bitマシンでコンパイルしたobjファイルが残っている。
新たに実行する方は、これらを一旦削除してもよく、基本的には内部のコードからobjファイル
が生成できるようになっている。

●配布物のヴァージョンについて
  Revision.txtに配布物の履歴があるため、かならず参照のこと。

●文書ファイルついて
 Program_id.xls  内容物の説明
 Revision.txt   これまでの文書、およびプログラムの更新履歴

●サウンドについて
 プログラムで用いた出力も併せて残してある。
 本プログラム以外で作成された音、サンプル音は以下のとおり。
    fot.bak.441.wav 女声 短文章
     fot.bak.44.wav 同上
     summer2006_5.wav finaleで作成したピアノサンプル音
  フォルダ summer2006  summer2006_5.wav 関連のヴァリエーション

●本プログラムはWindows XP, Windows Vista, Windows 7で動作確認済み。
        また、32bitマシンだけでなく、64bitマシンでも動作確認済み。

●コンパイラからの警告について
 bcc32では、変数を定義しておきながら、プログラムで使用しない場合はW8057のコードで、
 また、変数に代入しておきながら、その行以降でその変数を使用しない場合W8005 のコードで
 警告が出る。
 警告 W8057の例:
  int abc;
   以後の本文ではabc を一切使用しない場合。

 警告 W8004 の例:
   int def;
    def= 1.5*4;
    この行以降で 右辺にdefが来る式がない場合。
 
本文や本サイトで紹介しているプログラムには、これらの警告が出るものがある。
W8057はプログラムの開発途上で必要であった変数が最終的に不要となり、建築物の養生や
足場と同様に、完成時には撤去(削除)すべきであるがこれを削除し忘れたものである。

W8004も同様に、開発途上で必要とあった計算が、完成時にはその計算結果を利用しない場合など
がある。

これらは、本来完全に消し去るべきである、との考えが自然ではあるが、ここでは、以下の
考えにより、多少の警告を残したままとする。

特に6章のPv, Sinuなどの応用プログラムは、中間パラメータも多少は変更時には必要との判断と
以下の本コンパイラの特有の事情により、本来警告すべきでないものも警告とすることになる。

警告なしの例
    nwdw=2*L*nfft+1;
    hamwdw1(hwdw,nwdw);

警告 W8004 の例:
    hamwdw1(hwdw,(nwdw=2*L*nfft+1));

プログラムの動作はまったく同一にもかかわらず、これらは警告が出る。

これらの警告が煩わしい場合は、以下のコンパイルスイッチを使用することを勧める。
例プログラムtest.cの警告を表示させない場合。

    bcc32 -w-8057 test.c
    bcc32 -w-8004 test.c

●プログラムについて
 本文とともにお読みください。
---------------
3.4 簡単なプログラム【リスト3.1】
実行ファイル作成 および実行
 bcc32 hello.c
 hello
---------------
3.5 音ファイルの入出力 wavreadtest.c【リスト3.2, 3.3, 3.4, 3.5】
実行ファイル作成
 bcc32 -c wavread.c
 bcc32 -c wavwrite.c
 bcc32 wavreadtest.c wavread.obj wavwrite.obj
実行
 wavreadtest inputsound.wav outputsound.wav

---------------
3.7 正弦波音ファイルの作成 sine.c【リスト3.6】
実行ファイル作成(コンパイル・リンク)および実行例
 bcc32 sine.c wavwrite.obj
 sine 88200 10000 440 44100 3.6.sine.wav

==========================================================================
Windows APIを用いたプログラム
参考資料
1. マルチメディアプログラミング
http://www13.plala.or.jp/kymats/study/multimedia.html

2. Atelier Blue内 WAVEファイルのデータをリアルタイムに書き換えて再生する
http://www.atelier-blue.com/memo/memo2006-4-22.htm

---------------
3.8.1 ウィンドウの表示 winapi_test.c【リスト3.7】
実行ファイル作成 および実行
 bcc32 -W winapi_test.c
 winapi_test

コンパイル時に以下の警告が出る。
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
winapi_test.c:
警告 W8057 winapi_test.c 49: パラメータ 'hPrevInstance' は一度も使用されない(関数 WinMain )
警告 W8057 winapi_test.c 49: パラメータ 'lpCmdLine' は一度も使用されない(関数 WinMain )
警告 W8057 winapi_test.c 49: パラメータ 'nCmdShow' は一度も使用されない(関数 WinMain )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

これらの警告は変数を定義しているのに使用していないことに対する警告である。
プログラム使用上の実際に不都合はない。この例では、include fileのwindows.h
 の中でさらにincludeしているwinbase.h の中で、1262-1267行目

WinMain(
    IN HINSTANCE hInstance,
    IN HINSTANCE hPrevInstance,
    IN LPSTR lpCmdLine,
    IN int nShowCmd
    );
と定義しており、この定義に沿ってリスト3.7のようにプログラム上で必要のない
変数を記述している場合に生ずる警告である。一方、これらの変数を除去すると、
この定義に反する意味で、逆にコンパイル時にエラーとなる。

本書では、Windows APIの簡単な紹介にとどめるため、include fileを利用してい
る。一方、これらの変数をダミーで使用するような無駄な処理は行わないため、
コンパイル時の警告は不可避なものとして登場する。以降のWindows API使用時の
プログラムも同様な現象が出る。
これを上記を抑えるために、-w-8057を加える。

bcc32 -W -w-8057 winapi_test.c

---------------
3.8.2 ボタン・OKボタンの表示と簡単な描画 winapi_test1.c【リスト3.8】
実行ファイル作成 および実行
 bcc32 -W winapi_test1.c
 winapi_test1

警告を抑える場合の実行ファイル作成
 bcc32 -W -w-8057 winapi_test1.c

---------------
3.9.1 ディスクファイルからの再生 wav_multi_file.c【リスト3.9】 
実行ファイル作成 および実行
 bcc32 -W wav_multi_file.c wavread.obj
 wav_multi_file

エラーが起こる場合は、リスト3.9の15行目を見られたい。
本文中にあるように、作業フォルダがc:¥srcでないとエラーが起こるため、注意を
要する。
なお、ソースコードは、上記参考資料 2)を参考にし以下の点を考慮して製作した。
1. ステレオ信号の加工再生をモノラル信号の再生とした。
2. 音ファイル関係を特別なopenWaveFile関数を用いずにwavreadを用いた。
3. 簡易化するため、349行のプログラムから194行とした。

注:警告W8060も本体の動作には影響しない。
【警告を非表示にする実行ファイル作成】
 bcc32 -W -w-8060 -w-8057 wav_multi_file.c wavread.obj

---------------
3.9.2 関数波形のリアルタイム再生 wav_multi.sine.c【リスト3.10】
実行ファイル作成 および実行
 bcc32 -W wav_multi.sine.c
 wav_multi.sine

操作:ウィンドウ内で左クリックで再生、右クリックで停止。ウィンドウを消去して
も音は停止する。
本プログラムの特徴
9行目
double f=357.43 ; // 信号の周波数〔Hz〕
とあるように、任意周波数の正弦波が途切れずに、永久に継続して再生する。

---------------
3.9.3 鍵盤制御によるハーモにクス音の制御 wav_multi.harm.c【本文中リストなし】
実行ファイル作成 および実行
 bcc32 -W wav_multi.harm.c
 wav_multi.harm

【警告を除去した修正版】 wav_multi.harm.v1.c
実行ファイル作成 および実行
 bcc32 -W -w-8057 wav_multi.harm.v1.c
 wav_multi.harm.v1

操作:ウィンドウ内の鍵盤内で左クリックで再生、右クリックで停止。ウィンドウを
消去しても音は停止する。なお、停止と再生を交互に行うことは考慮されておらず、
通常は一回停止すると音の再生はなされない。敢えて行うためには、鍵盤上で右クリ
ックで停止したあと、一旦ウィンドウ内の鍵盤外へ出て、左クリックをし、一定時間
経たのち、鍵盤内に戻ると初期状態に戻り再生可能となる。

---------------
3.9.4 波形テーブル合成 wavtable0.c【本文中リストなし】
実行ファイル作成 および実行
 bcc32 -W wavtable0.c
 wavtable0

操作:ウィンドウ内の鍵盤内で左クリックで再生、右クリックで停止。トラックバー
の位置をマウスのドラグにより移動することにより、正弦波の周波数を変更できる。
周波数は表示される。特徴:関数sine_func内で、周波数が異なるときスムーズに移行
できるよう振幅を補間しながら接続を行う(クロスフェード)

【警告を非表示にする実行ファイル作成】
bcc32 -W -w-8057 wavtable0.c

==========================================================================
4.1 関数波形の合成 func_gen.c【リスト4.1】
実行ファイル作成 および実行
 bcc32 func_gen.c wavwrite.obj
 func_gen func# n_data amp f fs filename

実行例
 白雑音 2秒 振幅:10000 (440はダミー) サンプリング周波数:44100Hz
 func_gen 1 88200 10000 440 44100 outsound.wav

 三角波 2秒 振幅:10000 信号周波数:440Hz サンプリング周波数:44100Hz
 func_gen 2 88200 10000 440 44100 outsound.wav

---------------
4.2 変調合成 func_gen1.c 【リスト4.2(抜粋)】
抜粋は上記プログラムの42-51行目、および 62-83行目
実行ファイル作成 および実行
 bcc32 func_gen1.c wavwrite.obj
 func_gen1 func# n_data amp f(fc) fm I fs filename

注:ソースコード中cons1,cons2なる変数は不要でコンパイル時も警告が出るが、
実行上のエラーにはならない。本文との対応上、これらを除去修正しないプログラム
を残す。
修正版
 func_gen1.v1.c

実行例:
正弦波のように、これほど多くの引数がいらない波形合成も、ダミーの値を必ず入れる。
以下の正弦波の場合で1500と3.0、またRMの2 はダミー数値である。

正弦波 2秒 振幅:10000 信号周波数: 440Hz サンプリング周波数:44100Hz 
         出力ファイル:outsound.wav
func_gen1 0 88200 10000 440 1500 3.0 44100 outsound.wav

RM 2秒 振幅:10000 搬送周波数fc: 440Hz 変調周波数fm: 2Hz サンプリング周波数:
         44100Hz 出力ファイル:outsound.wav
func_gen1 2 88200 10000 440 2 3.0 44100 outsound.wav

FM 2秒  振幅:10000 搬送周波数fc: 440Hz 変調周波数fm: 80Hz   変調指数I: 5.0
         2Hz サンプリング周波数:44100Hz     出力ファイル:outsound.wav
func_gen1 4 88200 10000 440 80 5.0 44100 outsound.wav

---------------
4.3 波形テーブル合成
 3.9.4 参照

---------------
4.3.2 掃引関数による波形テーブル合成
実行ファイル作成 および実行
 bcc32 -W wavtable_sweep.c
 wavtable_sweep

操作は 3.9.4 波形テーブル合成の操作と同様。

【警告を除去した修正版】 wavtable_sweep.v1.c
実行ファイル作成 および実行
 bcc32 -W -w-8057 wavtable_sweep.v1.c

---------------
4.4 Karplus-Strong方式による撥弦音の合成 Karplus.c 【リスト4.5】
実行ファイル作成 および実行
 bcc32 Karplus.c wavwrite.obj
 Karplus n_data amp f fs filename (本文p93 10行目はfが記載漏れ,
 また同様にリスト4.5内もこれと連動してfが記載漏れとなっている。
 ここでのKarplus.cは修正版を載せる。)

実行例
  同方式によるピッチ880Hz, fs:44100Hzの音を2秒分outsound.wavに合成する。
 Karplus 88200 10000 880 44100 outsound.wav

---------------
4.5 Karplus=Strong方式による打楽器音の合成 Karplus_drum.c 【リスト4.6 (抜粋)】
実行ファイル作成 および実行
 bcc32 Karplus_drum.c wavwrite.obj
 Karplus_drum wnoise n_data amp b f fs filename

実行例:
スネアの響き (b=0.5 更新周期 100Hz) 減衰時間は長い 2秒
 Karplus_drum 88200 10000 0.5 100 44100 outsound.wav

スネアの響き (b=0.5 更新周期 800Hz) 減衰時間は短い 2秒
 Karplus_drum 88200 10000 0.5 100 44100 outsound.wav

メタリックな響き (b=0.8 更新周期 100Hz) 減衰時間は長い 2秒
 Karplus_drum 88200 10000 0.8 100 44100 outsound.wav

---------------
4.6.3 母音'ieaou'の合成 Formant_Vocoder.c 【リスト4.7】
実行ファイル作成 および実行
 bcc32 Formant_Vocoder.c wavwrite.obj
 Formant_Vocoder

出力:sig.wav
注:コンパイル時にf0,iに関して代入した値の未使用の警告があるが、動作への影響はない。
本文との整合性のため、ソースコードは変更せず。

なお、下記の変更を加えれば、警告はでない。
59行目 ⇒ //  f0 = (F[0][0]+F[0][1])/2.0; // (この行を削除)
64行目 ⇒  for(/* i=*/ ipos=nrepeat=id=0;; /* i++ */) {  // iに関する部分を削除
70行目 ⇒    nrepeat = fs/(/* f0=*/ (F[0][0]+F[0][1])/2.0 // f0に関する部分を削除

修正版 Formant_Vocoder.v1.c
---------------
4.7 歌声の合成 (CHANT方式による歌声の合成)
4.7.6 実プログラムと実際の計算 chantS.c【リスト4.8】
 "                     FOF関数  FOF.c【リスト4.9】
実行ファイル作成 および実行
 bcc32 -c FOF.c
 bcc32 chantS.c FOF.obj wavwrite.obj
 chantS outfile.wav

注:コンパイル時に警告で値が未使用となるNtauは、最初に定めた2.4秒長のサン
プルが本文図4.20のようにインパルス応答をtauづつずらすときに生ずるインパルス
応答の数で整数。変更時やモニター時に有用な変数ゆえ現在未使用であるが残している。

警告を抑えるコンパイル
 bcc32 -w-8004 chantS.c FOF.obj wavwrite.obj
---------------
4.8 打撃音の合成
4.8.4 打撃音の合成 本体プログラム PhM_Armk1.c 【リスト4.10】
 "   関数:3×3の逆行列算出  inv3.c 【リスト4.11】
 "   関数:楽器idから音色パラメータ算出  Timbre_Paraset.c 【リスト4.12】
【バグ】
PhM_Armk1.c の91行目
誤  for (j=0; j<=Nmaterial; j++) {
正  for (j=0; j<Nmaterial; j++) {

Nmaterialの直前の = を削除
*サーバ上のファイルは本文の誤りを修正済み
【軽微な修正】(実施済み)
73行 Amp = 0.1; → コメントアウト // Amp = 0.1;

実行ファイル作成
 bcc32 -c inv3.c
 bcc32 -c Timbre_Paraset.c
 bcc32 PhM_Armk1.c inv3.obj Timbre_Paraset.obj wavwrite.obj
 
実行例
 PhM_Armk1 xylo_ 0

これは、xylophoneの音色(id=0)で、出力として
xylo_Glass.wav, xylo_Steel.wav, xylo_Wood.wav
の3種類の音ファイルが合成される。

==========================================================================
5.1 撥弦による簡易シーケンサ Karplus.seq1.c 【リスト5.1】
実行ファイル作成 および実行
 bcc32 Karplus.seq1.c wavwrite.obj
 Karplus.seq1

実行例
  Karplus.seq1 1 10000 80 44100 Melody_I.wav

---------------
5.3 理想的ローパスフィルタ他HPF,BPF,BEF filt_LPFapp.c 【リスト5.2】
5.3.1 ローパスフィルタ設計関数 lpfdsn関数 【リスト5.3】
5.3.2 ハイパスフィルタ設計関数 hpfdsn関数  【リスト5.4】
5.3.3 バンドパスフィルタ設計関数 bpfdsn関数 【リスト5.5】
5.3.4 バンドエリミネートフィルタ設計関数 befdsn関数 【リスト5.6】
実行ファイル作成 および実行
 bcc32 filt_LPFapp.c wavread.obj wavwrite.obj
 filt_LPFapp func# inputfile outputfile

実行例
LPF fc=3000Hz
 filt_LPFapp 0 Melody_I.wav MelodyILPF3k.wav

---------------
5.4 櫛型フィルタとオールパスフィルタ filt_catalog1.c 
5.4.1 FIR櫛型フィルタ(1) 加算の場合 case 4 と関数 FIRcomb 【リスト5.7】
5.4.2 FIR櫛型フィルタ(2) 減算の場合 case 5 【リスト5.8】
5.4.3 IIR櫛型フィルタ(3) 加算の場合 case 6 と関数 IIRcomb 【リスト5.9】
5.5 オールパスフィルタ オールパスフィルタ関数 Allpass関数 【リスト5.10】
実行ファイル作成 および実行
 bcc32 filt_catalog1.c wavread.obj wavwrite.obj

実行例 FIR櫛型フィルタ(1) 加算
 filt_catalog1 4 Melody_I.wav Melody_CombAdd4.wav

---------------
5.6.1  1タップ遅延処理 onetap_delayline.c 【リスト5.11】
実行ファイル作成 および実行
 bcc32 onetap_delayline.c wavread.obj wavwrite.obj

実行例
 onetap_delayline fot.bak.441.wav fot.bak.441.del1.8.wav

---------------
5.6.2  マルチタップ遅延処理 Mtap_delayline.c 【リスト5.12】
実行ファイル作成 および実行
 bcc32 Mtap_delayline.c wavread.obj wavwrite.obj

実行例
 Mtap_delayline fot.bak.441.wav fot.bak.441.Mtdel1.8.wav

---------------
5.7.4 残響のシミュレーション rev_schoroeder1all.c 【リスト5.13】
 1-159行 メインプログラム 【リスト5.13 部分1】
 160-208行 関数 IIRcomb_revOnly 【リスト5.13 部分2】
 209-249行  関数 Allpass_rev 【リスト5.13 部分3】
  250-297行  関数 MTdelay0【リスト5.13 部分4】
実行ファイル作成 および実行
 bcc32 rev_schroeder1all.c wavread.obj wavwrite.obj

実行例
 rev_schroeder1all summer2006_5.wav summer2006_5.rev.wav

システムから以下のエラーが出力される。
 The number of clipped samples: 11
クリッピング歪を起こしたサンプルが11個あったとの報告である。
そこで、入力を6dB低くし、再度実行すると、今度はエラーがなくなる。

rev_schroeder1all summer2006_5.p.wav summer2006_5.p.rev.wav

---------------
5.8 非線形アンプ nonlinamp.c 【リスト5.14】
実行ファイル作成 および実行
 bcc32 nonlinamp.c wavread.obj wavwrite.obj

*ここで表示される警告は 上記の コンパイラからの警告についての項で、
W8004の警告例で示した理由による。82行目。したがって、削除せずに残す。

【警告を非表示にする実行ファイル作成】 
 bcc32 -w-8004 nonlinamp.c wavread.obj wavwrite.obj

実行
 nonlinamp func# 入力ファイル名 出力ファイル名
実行例
 nonlinamp 0 Karplus.demo.wav Karplus.demo.nonlin.wav
 magicN? 16


---------------
6.2.3 オーバーラップアド方式の基礎 overlapAdd_Basic.c 【リスト6.1】
   ハミング窓 関数 hamwdw1.c 【リスト6.2】
何も処理をしないオーバーラップアド方式

実行ファイル作成 および実行
 bcc32 overlapAdd_Basic.c
 Karplus.seq1  -1 10000 80 44100 wave001
 overlapAdd_Basic

2番目のコマンドはoverlapAdd_Basicは wave001という音ファイルを入力とするため、
これを作成している。このときのコマンドの2番目の引数は負値であり、wave001は
wavファイルでなく、rawファイルとなることに注意。なお拡張子はない。
 出力はdata1である。
なお、冒頭の3窓分は方式の特徴として原音の定数倍にはならない。本データは最初
から振幅値が大きいため、冒頭の差異は顕著である。

---------------
6.3.2-6.3.3 オーバーラップアド方式による細粒合成 overlapAdd_granular.c 【リスト6.3】
実行ファイル作成
 bcc32 -c wavRopen.c
 bcc32 -c wavWopen.c
 bcc32 -c wavWclose.c
 bcc32 overlapAdd_granular.c wavRopen.obj wavWopen.obj wavWclose.obj

実行
 ovelapAdd_granular I_fn nwdw nshiftA ratio(real) O_fn
実行例
 overlapAdd_granular fot.bak.44.wav 1440 360 3.0 outSound1.wav

---------------
6.4 振幅スペクトルからの信号波形推定による波形伸縮  OLA_sigEst.c 【リスト6.4】
実行ファイル作成 および実行
 bcc32 -c d1fft.c
 bcc32 OLA_sigEst.c d1fft.obj wavread.obj wavwrite.obj

実行:
 OLA_sigEst 入力ファイル名 出力ファイル名
実行例:
 OLA_sigEst fot.bak.441.wav fot.bak.441.st2.wav

音声を2倍に伸張する例である。実行には繰り返し計算のため、CPU性能にもよるが、
1-2分前後かかる。
本文でも述べているとおり、初期位相の選択は3通りあり、その選択により
処理音質も影響を受ける。本プログラムはその指標を以下のとおり「原音の分析結果」
からのもの、と固定している。
プログラム 43-44行目
 id_ph = 0;     // 初期位相の指標
                 // 0:原音の分析結果より 1:ランダム 2:ゼロ

---------------
6.6.1 フェーズボコーダ pv.c 【本文中リストなし】
6.6.1  フェーズボコーダによる伸縮 pv_st.c【本文中リストなし】

フォルダ Pv 内に関連するプログラムが全て格納されている。
説明は同フォルダ内の ReadmePv.txt を参照

---------------
6.7 正弦波モデル geneMQ.c 【本文中リストなし】
     関数:トラック情報からの音合成 genesinu.c【リスト6.5】
 説明はフォルダGeneMQ内のReadmeMQ.txtを参照。

sound-effect's People

Contributors

shohei avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.