サウンドプログラミン ..
184:デフォルトの名無しさん
06/08/07 18:08:53
反射以外の吸音原理:
ダクトを2又にすれば、片方の通路の音は当然1/2になる。
つまりそこで反対位相で振幅1/2になるようにスピーカーをコントロール出来れば
スピーカーがエネルギーを1/2吸収した事になる
185:デフォルトの名無しさん
06/08/07 18:34:22
床天井壁が均質な部屋に明かりが灯っている。
明かりを壁が αだけ吸収し (1-α) 反射するとする。
反射した光は再度反射するから (1-α)+ (1-α)^2+ (1-α)^3 .... と無限に反射する
部屋の明るさは 真っ黒な壁の部屋にくらべて Σ(1-α)^n 倍明るくなる。
αが小さくなると、この倍率はとても大きくなる。
白い壁、明るい色の床の狭い部屋は蛍光灯1灯でも十分明るい。
しかし、壁に黒い学生服をかけるだけで突然暗くなる。
学生服が光を吸収してしまうからだ。
同じ事は音についても言える。 部屋の中で音は壁で何度も反射される故に音は大きくなる。
この原理で増幅された音は、一箇所で吸音するだけで一瞬で小さくなる。
これを電気的に起こせば
186:デフォルトの名無しさん
06/08/07 18:38:13
光のように音を吸収できる素材なんてない。
187:デフォルトの名無しさん
06/08/07 21:08:44
音のように光を吸収できる素材なんてない。
188:デフォルトの名無しさん
06/08/07 22:52:23
観測者の位置でだけ消音状態にしたいんじゃないのか?
189:デフォルトの名無しさん
06/08/07 23:27:28
・耳から入る音以外(体が感じる音)をどう消すのか
・既に届いてる音に対して、プログラムで対処するなら>>150の言うように周期性から予測して打ち消すしかない
・上記方法の場合でも環境依存をどう対処するか(マイクとヘッドホンの配置と特性、PCの構成等)
>>143
汎用的な物は限りなく無理に近いと思うけど、
環境依存覚悟で実験してみる価値はあるんじゃね?
190:デフォルトの名無しさん
06/08/08 01:49:16
音消してくれるエアーカーテンほしいよね。
それとどんなに大声でしゃべっても通話相手にしか聞こえないマイクもほしい。
超音波ですんごいピンポイントの指向性もったスピーカー作ったのあったじゃない。
あの技術とか使ってできないかな。
191:デフォルトの名無しさん
06/08/08 03:00:21
>>190
>音消してくれるエアーカーテンほしいよね。
音波レンズというものがあるので、焦点が自分の方に来ないようにしてしまえば
エアカーテンに相当するものは可能だと思う
3次元に広がる音をピンポイントで消すには
上で何度か言われている(言ってるひとは勘違いしてるみたいだけど)
逆位相の部分での干渉を利用すれば出来なくはない
ただしピンポイントなので他の場所は静かにならないし
3次元的にはエネルギーも決して無くなる訳ではない
>それとどんなに大声でしゃべっても通話相手にしか聞こえないマイクもほしい。
>超音波ですんごいピンポイントの指向性もったスピーカー作ったのあったじゃない。
>あの技術とか使ってできないかな。
すこしずらした非可聴周波数音を二つのスピーカーから発生させて
その二つのベクトルの交わる部分のみずれからくるうなりで
可聴周波数を再現するという話が出たことがあると思う
192:デフォルトの名無しさん
06/08/08 07:50:58
>>188
その位置だけ消音といっても、3次元空間内でそういう点を作るのは難しい
もし可能だとしても、そこで定在波を作ってるようなものなので、
節と腹が生じる。 節で音量がゼロなら、腹では音量は2倍になるという事になる。
耳が2つあり音速は330メートル/秒程度なので、300Hz以上では
両方の耳に節が来るような定在波を作る事は出来ない
193:デフォルトの名無しさん
06/08/08 08:03:12
右耳と左耳の間隔が〜1m近くあるデカ頭の人キター
194:デフォルトの名無しさん
06/08/08 08:06:10
頭の直径が1mもあるわけねぇ〜だろ
330 [m] / ( 300 [Hz] × 2 ) = 0.505 [m]
>>192の頭の直径は 50cmしかないんだよ。
195:デフォルトの名無しさん
06/08/08 08:06:44
↑ 0.55 [m] orz
196:デフォルトの名無しさん
06/08/08 08:49:17
>>194
>>>192の頭の直径は 50cmしかないんだよ。
充分でかいよ。漏れの肩幅でさえそんなにないよ。
197:デフォルトの名無しさん
06/08/08 09:04:39
だから実際実用化されてるらしいでないの。
ただソフトウェアでとなると遅延時間がでかくなるから(一番でかいのはA/D/Aレイテンシー)、
そうとう条件は厳しくなるだろうね。
198:デフォルトの名無しさん
06/08/08 09:48:32
-6dB sin(30度)=0.5 だから 330 [m] / ( 300 [Hz] × 12 ) 約9cm
子供の頭?
199:デフォルトの名無しさん
06/08/08 09:50:18
そういや180度の場所も節だな
200:デフォルトの名無しさん
06/08/08 09:58:03
>>193-194 いいか、お前ら、
0 90 180 270 360
---______---~~~~~~---______---
節 腹 節 腹 節
波長が 1メートルなら 腹はその1/4と3/4のところだ
201:デフォルトの名無しさん
06/08/08 10:07:07
そうか、電話なんかは300Hz以下カットしてて、耳の感度が悪いのは 頭の大きさから来てるのか!
202:デフォルトの名無しさん
06/08/08 10:07:26
>>197
逆相で音を弱くするので実用化されてる例は、
踏み切り、病院、救急車、消音ヘッドフォン、高速道路、新幹線の線路などなど。
203:デフォルトの名無しさん
06/08/08 10:24:50
でも音を単に反射してるのだとすれば、高速道路なんかは高いマンションなんかは逆にうるさくなってるのかも
204:デフォルトの名無しさん
06/08/08 11:07:10
>>198
丁度頭の中央を狙えばそんなものじゃないの
頭の幅のデータ
URLリンク(homepage3.nifty.com)
平均
男 16.2cm
女 15.6cm
205:デフォルトの名無しさん
06/08/08 14:09:44
定在波と進行波で検索したリンクで初めて勘違いに気が付いた。
圧力と|速度| って 90度位相差が出るのは定在波の時だけで 進行波は同相だったのか
206:デフォルトの名無しさん
06/08/08 14:23:47
ダクトの中に細いフィラメントを沢山配線して通電する事で加熱
熱膨張で進行波を打ち消してしまうというのはどうだ?
207:デフォルトの名無しさん
06/08/08 14:55:09
プログラミングの話が全然出てこないのは何故?
208:デフォルトの名無しさん
06/08/08 15:47:21
>>207 何か質問があるならどうぞ
209:デフォルトの名無しさん
06/08/08 21:19:28
DPCMのいいエディタご存じないですか?
それとも、無きゃ作っちまえ、なスレですか?
210:デフォルトの名無しさん
06/08/08 22:43:58
>>209
それがローカルルールの範囲内の質問なんですか?
211:デフォルトの名無しさん
06/08/09 08:00:56
エディタといっても、波形を表示してそれをカットペースト+エフェクトするくらいだからなあ
波形をマウスで作ったりしたってまともな音にならない
212:デフォルトの名無しさん
06/08/12 08:12:36
URLリンク(www.miraikan.jst.go.jp)
213:デフォルトの名無しさん
06/08/14 02:21:43
MP3のエンコーダのライブラリでライセンスフリーのものってありますか?
ご存知でしたらどなたか教えていただけませんか。デコーダはあるんだけど。
214:デフォルトの名無しさん
06/08/14 03:06:13
>>213
ない
つか、もし配布元が問題ないといっても、F社やらT社は絶対それを認めないだろ
215:デフォルトの名無しさん
06/08/14 17:50:08
>>214
ではMP3のエンコーダ自体を自ら実装すれば問題のでしょうか?
216:デフォルトの名無しさん
06/08/14 18:15:24
>>215
フォーマット自体には特許の及ぶところではないというのは当たり前になっているわけで、
それゆえに、LZWの特許が有効だったときも無圧縮GIFは問題無いという考えが主流だった
そう考えると、確かmp3も圧縮アルゴリズムの特許は例の2社が持っていたはずで、
それなら無圧縮mp3は問題ないことになる。
だが、それってmp3の意味無いじゃん。
217:デフォルトの名無しさん
06/08/16 13:41:26
午後みたいに、インストーラーでコンパイルするという荒技もあるけどな。
しかし、あれは酷いやり方だな。
賛同はできん。
素直にソースだけ公開しとけば問題ないのに。
218:デフォルトの名無しさん
06/08/16 23:44:51
音ゲーで使えるようなくらいの遅延の少ないエフェクトの掛け方を探してます。
C#.NETで、DirectSoundのSecondaryBufferのエフェクトを使ってみたんだけど、
バッファに書き込んでから音が鳴るまでの時間が200msecくらいもあって、結構使えない。
そこで腹をくくってその辺りの処理を自前でやろうかと。
複数のwaveを鳴らして、その合成音にリアルタイムにリバーブエフェクトをかけるのって、
再生用バッファにwaveを加算(サンプル毎足し算)
その波形に対して随時インパルス応答を適用する
こんな感じで合ってますか?
219:デフォルトの名無しさん
06/08/17 07:05:55
あってるよ。 問題は飽和に対しての処理だけさ
220:デフォルトの名無しさん
06/08/17 08:37:15
午後でいくつかまとめて処理すると
ファイル名が入れ替わったりするバグありますよね?
221:デフォルトの名無しさん
06/08/17 08:54:04
>>220知らん。 つーか板違い
222:デフォルトの名無しさん
06/08/17 10:07:16
>>218
ASIOとかWDMとかに最適化しないとめちゃめちゃ遅れるよ。
223:デフォルトの名無しさん
06/08/17 16:09:30
>>220
翌日の朝やればいいじゃん
224:218
06/08/17 17:29:50
試しに2秒のwaveに100kbくらいのインパルス応答をFIRフィルタで適用してみたら
処理に糞時間かかった。。ノイズもいっぱい。
このやり方じゃダメですか?
ちなみに使ったインパルス応答
URLリンク(noisevault.com)
これのm1_44.wav
>>222
うちのオンボードじゃASIO4ALL入れても無理でした。
225:218
06/08/17 17:52:43
録音して波形を見てみたら、ノイズは>>219の忠告通り飽和が原因っぽかった。
飛び出したサンプルだけとりあえず範囲内に凹ましてみたけどノイズは和らいだだけ。
やっぱりその周辺も同じ比率でなだめないといけない?
処理に時間かかって仕方なす
226:デフォルトの名無しさん
06/08/17 18:04:28
インパルス応答をそのまま掛け算したら遅いのが当然
といってFFTで掛け算回数を減らす高速化をするとブロック処理になって、希望じゃないでしょ。
だからリバーブなら思い切って一定時間の遅延にしてしまうのがいいんじゃないの?
その遅延にIIR2時のLPFかければそれらしくなるさ。
227:デフォルトの名無しさん
06/08/17 18:59:33
デジタルリバーブの基礎から勉強したら?
リアルタイム性を重視してリバーブをかけるなら、
ディレイ時間の違うIIRフィルタの結果をさらにIIRフィルタに通すのが基本。
今のCPU速度だとゲームでコンボリューション・リバーブは非常識。
228:デフォルトの名無しさん
06/08/17 19:13:01
EAXのリバーブとか使えないか?
幾分ハードウェア処理だから軽いだろ
229:218
06/08/17 21:29:11
IIRで何とかなるならそれに決めたいんだけど、探してきた↓のサンプルだと音が曇ってしまった。
URLリンク(www.morikita.co.jp)
フィルタが悪いだけ?良いフィルタのサンプルは無いだろうか。
>>227
フィルタ1の出力をフィルタ2の入力にして、その出力を適用という作業をサンプル毎に行う
と解釈してみた。
>>228
SDKが見つからないよう
230:デフォルトの名無しさん
06/08/17 22:34:37
遅延が…遅延がぁぁっ!
231:デフォルトの名無しさん
06/08/17 22:43:59
係数が…係数がぁぁっ!
232:デフォルトの名無しさん
06/08/18 06:37:49
>>229
2次のIIRフィルターは LPFならf0とQで係数が決まるけど、それぞれいくらにしてるの?
Q=0.7程度にして f0を変化させてみたら?
それから、あくまでも遅延した方にだけIIRをかけて、元の信号と加算するんだよ。
加算した結果飽和するなら音量を下げるAGCを使うか
飽和しないように a , (1-a) の比率で加算するか
233:デフォルトの名無しさん
06/08/18 12:05:06
ああ、まさか>>229のソースで係数そのまま使ったって事?
そのレベルならとりあえず1次のLPFでやってみたら?
過去ログ のレス14より
URLリンク(www.2chdat.net)
1次のLPFは
w =2*π*f0/22050.0;
r =tan(w/2);
b =(1-r)/(1+r)
・・・・・略・・・・
y:=b*(x-y)+y と計算します
xが入力で yが出力だよ そしてyはグローバルに取るんだよ。
でbを可変してみて感じのいい所を探してみるといいよ
高域をもう少し減衰させたいなら2段するといいよ
234:218
06/08/18 19:48:30
フィルタ係数の算出方法があったのか( ゚д゚)…今見見返してみると過去ログが宝の山に見える。
そういえばさっきから全然残響音が出ないなぁと思って考えてみたんだけど、
1サンプル前じゃなくてもっと前のサンプルをフィードバックすれば良かったのか!?
っと気づいてから今更>>226の意味を理解した。ぁーぁー
それから1次なり2次のIIRを掛けて高音減衰させれば良い感じになるのか。
一応これでそれっぽいのは聞こえるようになったよう。みんなありがとうヽ(゚∀゚)ノ
後はこれとミキシングがどのくらいのレスポンスで出来るかどうかー
235:デフォルトの名無しさん
06/08/18 19:52:51
IIRは発振しないようにパラメータ選びは慎重にしてね( ´∀`)b
236:デフォルトの名無しさん
06/08/19 01:44:34
>>9-11を参考にして、ブロックのサイズを凡そ0.1秒にして、
音程変化の内速度調整を実装したところ、
再生速度を0.5倍にするところまでは非常にスムーズな音でこれを実現できました。
しかし、0.5を下回る倍率(〜x0.4)になった途端、音声が毒電波状態です。
現時点での実装は
・ブロックの間引き(重複)
・ブロックの窓関数処理
のみで、
・空白を優先
・繰り返しを配慮
という二点は実装していません。
自分の作っているプログラムでは効率が悪すぎて、
この二点を実装しようとすると処理時間が不足するおそれがあり、
何よりこの二点の効率の良い実装方法が思いつかなかったので。
よくよく考えてみると、この機能を実装しているプレイヤの内のいくつかは、
やはり0.5倍を下限に置いている様なのですが・・・。
何か良い解決方法はありますでしょうか?
また、それはどのような方法か教えてください。
237:デフォルトの名無しさん
06/08/19 03:24:13
ァ・・・もしかしてサンプリング定理と関係があるのか・・・?0.5倍ってのが2の逆数であることから考えても・・
238:デフォルトの名無しさん
06/08/19 05:11:04
やっぱ厳密にはオーバーサンプリング+アンチエイリアスを
かけてから処理すべきとこなんじゃないの
239:デフォルトの名無しさん
06/08/19 07:28:47
音程が変っているのなら、サンプリング速度が変化しているからどこかの段階でLPFを入れておく必要があるよ。
そうじゃないと折り返し雑音が問題になる。
綺麗な音にしたいなら、最低2倍のオーバーサンプリングしておいた方がいいかもね。
音程が変らずに再生速度だけ変化させてるならサンプリング定理の問題じゃない
0.5を下回る場合に問題が出るという事は
0.5を下回ると同じ音を3度以上繰り返し利用しなければならなくなるけど
その処理がはいってないんじゃないの
240:デフォルトの名無しさん
06/08/19 09:10:42
>>238-239
書き方が悪くてすみません。
「音程を変化させずに速度変化をした」
処理です。
>>239
いいえ、3度以上の繰り返しについても問題なく実装しているはずです。
DirectSound+C#なので、部分抜き出しが難しいですが・・、
0.5以上1倍以下ではどれだけ細かい指定をしても平気なので、
ここにバグがあるわけでは無い・・・とは思うのですが。
decimal readCount = 0;
decimal readSpeed = 0.4;
for(writePoint=0;writePoint<(一秒分のバッファ長);writePoint+=(0.1秒分のバッファ長))
{
readCount += (double)readSpeed;
for(i=0;i<readCount;i++)
{
/* [readBufferに0.1秒分読み込み] */
}
/* [readBufferから書き込み用バッファにwritePoint位置でコピー] */
readCount -= (int)readCount;
}
/* [書き込み用バッファを再生バッファにコピー] */
という感じでの実装です。
なんだっけ、グラフィックとかで良く使う「斜めの直線を整数型のみで計算するアルゴリズム」を応用した感じなのですが。
241:デフォルトの名無しさん
06/08/19 09:12:30
あ、Shift+Enter間違えて押してしまった・・・。
改行と書き込みがメッセとは逆だから間違えるなぁ・・・
とりあえず、お二人のご意見から
オーバーサンプリング+アンチエイリアスについても実装を検討してみます。
242:デフォルトの名無しさん
06/08/19 09:16:02
あともう一点追記です。
240で示したソースの中で、i以外の変数はすべて
クラススコープです。iのみがメソッドスコープになっております。
readCountがメソッド呼び出し毎にリセット、というわけではありません。
おまけに分かりづらくてすみません・・・。
243:デフォルトの名無しさん
06/08/19 09:24:22
音程が変化していないという事は、サンプリングレートが変化してないわけでしょ?
だったら オーバサンプリングとかLPFは必要ないよ。
で、やっぱり3度利用する部分に単純にバグがあるのだと思うよ
もっとも3度も利用すると違和感があるという事なら当然そうだろうけどね
あまり2倍以上遅くする場合は、やっぱり無音期間を検出して、そこを出来るだけ引き延ばす方がいいと思うよ
たとえば0.1秒のブロックを0.05くらいに小さくして、そのブロックの音量が今までの音量より一定比率より小さいなら、
その部分の繰り返し回数を出来るだけ多くするとか
244:デフォルトの名無しさん
06/08/19 09:31:35
まてよ >>240の定数だと、引き伸ばしではなくて短縮なんだよね?
短縮で0.1秒単位に2ブロック以上連続してすてるようになると、音声だと何を言ってるのか判らないようになってしまう。
そこまで強力に短縮するなら、
まず周期性を検出して周期の整数倍の
もっと小さいブロック (1/30)〜1/60のような(ブロックというよりgranul) サイズにして
それを捨てるようにする。必要があるよ。
245:デフォルトの名無しさん
06/08/19 09:35:11
サウンドプログラムの本ってあんまりないよね
246:デフォルトの名無しさん
06/08/19 09:40:53
!バグ見つけた!
>>243
バッファを注意深く見たところ、きちんと三度利用されるところは三度利用されていました。
ですが、読み込み時に窓関数をかけるのではなく、書き込み時に窓関数をかけていたため、
一回目の利用>二回目の利用>三回目の利用
と、窓関数により一気に減衰していました。
これをなおしましたが、やはり違和感は酷いです。
どうやらご提案の通り、きちんと無音期間や繰り返し周期の懸念を行わないといけないようです。
>>244
いいえ、短縮ではなく延長です。
なぜならreadCountは
一回目のループで0.4→読み込まない(readBufferはデフォルト0配列)
→書き込みバッファには0が書き込まれる
二回目のループで0.8→読み込まない
→書き込みバッファには0が書き込まれる
三回目のループで1.2→読み込む(readBufferには0〜0.1秒分の)
→書き込みバッファには0〜0.1秒分のデータが書き込まれる
四回目のループで0.6→読み込まない
→書き込みバッファには0〜0.1秒分のデータが書き込まれる
五回目のループで1.0→読み込む
→書き込みバッファには0.1〜0.2秒分のデータが書き込まれる
という感じに機能するので・・・。
247:デフォルトの名無しさん
06/08/19 09:48:58
出来るだけ無音期間を検出して無音期間を引き延ばすのが第一
次善は、周期を検出してその周期の整数倍にgranulを切り出して
それを並べる
音声の場合は周期の揺らぎが音声らしさを作ってるから
母音の部分の極端な引き伸ばしは巧くゆかないけどね(周期性が増すと声が変ってしまうから)
やらないよりはマシ
248:236
06/08/19 09:52:20
うん、どうやらその方法をとるしか無い様ですね。
・・・分かり切ったことを聞いたようで、すみませんでした。
しかしそうすると演算量が極端にあがるなぁ・・・
全量ノルムチェックと倍速調整か・・・うは、頭いてえ
249:デフォルトの名無しさん
06/08/19 10:07:55
Σx^2はそんなコストはかららないでしょ
周期検出の方が計算コストの低いのを探すのは大変でしょ
250:236
06/08/19 10:22:12
>>249
やぁ、せっかくあちこちダイエットしたのになぁ、ってボヤキです。
再生に関係しない他のところが処理コスト食い過ぎで、
再生するとCPU利用率が3%くらい跳ね上がるもんですから。
実質的な問題はただ単に面倒くさいだけです、本当にすみません。
251:デフォルトの名無しさん
06/08/19 10:23:57
急に内容が難しすぎ。
252:236
06/08/19 10:32:11
・・・確率論的に乱数で処理の是非を決定して無音部分の処理確率をあげt
いや、やめておこう
253:デフォルトの名無しさん
06/08/19 10:40:30
>>234
毎サンプルデータ毎に
Xを入力 Yを出力 配列をM, rwp,
Y = X*(1-g) + LPF( M[ (rwp +T) % SIZE] ) *g
M[rwp] = Y
rwp=rwp % SIZE;
てな計算になるだけだから、別に遅延などそう必要ないでしょ
254:デフォルトの名無しさん
06/08/27 18:27:58
QuickTimeSDKつかいづらい・・・・・・・
255:デフォルトの名無しさん
06/08/30 15:08:42
波形を合成する機能をもったライブラリって例えば
どのようなのがありますか?
256:デフォルトの名無しさん
06/08/30 16:11:14
DirectSound
257:デフォルトの名無しさん
06/08/30 23:33:24
8000Hz,8bitで取り込んだ音の中に、1KHzの音が混じってるかどうかだけをリアルタイムに調べたいんですが、低スペックマシンで処理するのにおすすめの方法はありますか?
258:デフォルトの名無しさん
06/08/30 23:36:44
FFTを応用すればどうとでも出来るとおも
259:デフォルトの名無しさん
06/08/31 10:30:18
>>257
フィルタ使うのが軽い。
260:デフォルトの名無しさん
06/08/31 10:31:42
バンドパスフィルタを使って音量レベルを計ればいいんだ
261:デフォルトの名無しさん
06/08/31 13:25:22
音程を変えるのに FFT を使ってるソフトがあるらしいのだが、
どういう風に使ってるんだろう。
単純に区間に区切って FFT かけて周波数を n 倍して戻すのって、
時間軸で重複させるのと等価だよなぁ。
位相をうまく合わせればちっとは良くなる気もするが、窓関数かけてたら
ほとんど影響なさそうだし。
262:デフォルトの名無しさん
06/08/31 14:44:40
>>261
ヒント:フォルマント
263:デフォルトの名無しさん
06/09/01 07:53:32
>>17 を参照。
264:デフォルトの名無しさん
06/09/01 15:20:35
> 全体を一度に収まる大きなサイズのFFTで行う方法
これ試したことあるけど、まともな音にならない。
長い区間をフーリエ変換しても、意味のある情報は得られないと思う。
> ピッチシフトは周波数軸での単なるシフトではなく、指数的移動なので
これの意味が良くわからん。定数倍すりゃいいだけじゃないの?
265:デフォルトの名無しさん
06/09/01 19:12:02
>>264
恐らく「音程」に対して周波数係数が「指数」になるって言いたいんじゃないかな。
音程 周波数
-12 *2^(-12/12)
-11 *2^(-11/12)
・・・ ・・・
-1 *2^(-1/12)
±0 *2^(±0)
+1 *2^(+1/12)
・・・ ・・・
+11 *2^(11/12)
+12 *2^(12/12
だから・・・
まあ何かを勘違いしている恐れがあるけど
266:デフォルトの名無しさん
06/09/01 20:15:03
その周波数軸の定数倍をどう実現してるの?
たとえば 2^(+1/12) = 1.05946309435929526 となって綺麗な比率にはならない
特に低周波は目が荒くなるわけで
これを旨く処理するには exp(2πki)という指数=三角関数が必要にならない?
267:デフォルトの名無しさん
06/09/01 22:00:18
>>266
指数的な補完が必要ってことか。なるほど。そこまで考えてなかった。
でも、上にも書いてあるけど、周波数軸を a 倍するのって
時間軸を 1/a 倍するのと同じだよね。(音量は a 倍違うけども)
FFT 使う意味がいまいち分からないなぁ。
268:デフォルトの名無しさん
06/09/01 23:23:01
DARU/PITCH-SHIFTER!だと音程+1で1.05946314って表示されるよ。
綺麗な比率では無いけど考え方はあってるんじゃないの。
周波数軸上でスペクトルを上下させるのがピッチシフトだっけ?
269:デフォルトの名無しさん
06/09/02 11:50:35
>>267
たしかに。
下限周波数 f_low [Hz]で周波数スペクトルを測定するには、
有限の時間1/f_low [sec.]かかるので、
結局のところグレイン・サイズ 1/f_low [sec.]で
グレイン操作して、ピッチシフトを表現することしかできないね
270:デフォルトの名無しさん
06/10/05 00:10:57
URLリンク(pc.watch.impress.co.jp)
URLリンク(www.drk7.jp)
271:デフォルトの名無しさん
06/10/11 18:43:00
今、ASIO2.0のSDKのサンプルをいじってるんだが、どこで再生しているのかわからない。
誰か教えてくれません?
272:デフォルトの名無しさん
06/10/11 22:35:32
ASIO_Init()の中をループしている最中にbufferSwitchTimeInfo()がcallbackで呼ばれる
と思った
273:デフォルトの名無しさん
06/10/11 22:37:45
いやbufferSwitch()か・・・まぁその辺
274:デフォルトの名無しさん
06/10/12 00:30:37
確かにここらへんが怪しいとは思うんだけど、どういじくったら音を出せるのかがわからない。
asioCallbacks.bufferSwitch = &bufferSwitch;
asioCallbacks.sampleRateDidChange = &sampleRateChanged;
asioCallbacks.asioMessage = &asioMessages;
asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo;
誰か音を出す方法を教えてくださいな。
275:デフォルトの名無しさん
06/10/12 00:57:17
あ、ごめんinit()は自作関数だったかもw 昔書いたのを適当に眺めて書き込んだんで・・・
再生するサンプルソースがあると思うけど要するにその辺のcallback定義して開始すると
ASIOのsystemからbufferSwitchTimeInfo()が呼ばれる。
その中で要求された形式に応じてbuffを充填して戻る
無音だかを再生するサンプルがあると思うんで〜Info()にbreakpoint貼って
要求されたcaseのmemsetを適当な波形を返すようにしてみるとか、その辺からやってみては。
276:デフォルトの名無しさん
06/10/25 23:43:20
bufferSwitchTimeInfo()をいじくったら音が出るようになったよ!
さんくす!
でもなんか音が途切れ途切れ。。。ブツブツだわ。
どうしたらスムースになるんだ?
誰かわかる人助けてください。
277:デフォルトの名無しさん
06/10/28 04:28:22
まだキャプチャーした音を再生するところまでしか作ってない「ヘボな段階」なので、
ファイル書き出し機能を作ってから聞けばいいのかもしれないのですが、
書き出し機能を作るときからおおまかな部分について知っておいた方がいいかなと
思いましたので、質問です。
キャプチャして録音しながら
DVDレコーダなんかでよくあるタイムシフトの機能を扱いたいと思っているのですが、
どういった手順になるのでしょうか?おおまかな流れについて教えて下さい。
waveもしくはmp3をストリームして録音しているときに単純にそのファイルを
開いて再生するだけなのでしょうか?
それとも、何かあらかじめ準備しなければならいことがあったり
特別な手順を踏んでタイムシフト用のファイルを作ったりしないといけないのでしょうか?
mp3でタイムシフトやるときとwaveでタイムシフトやるときのファイル形式による懸念点などありましたら、
それも教えて欲しいです。mp3でやってもwaveでやっても一緒なのでしょうか?
278:デフォルトの名無しさん
06/10/28 09:19:09
Adudacity でタイムシフト再生なんか出来たか?
279:デフォルトの名無しさん
06/10/28 09:20:00
あ、Audacityスレとまちがえてかいてしまったごめんよ。
280:デフォルトの名無しさん
06/10/28 12:41:11
>>277
FILE_SHARE_READでCreateFile()してやればいいんじゃね?
録音用のHANDLEと再生用のHANDLEで別にCreateFile()すればseek位置で干渉しないし。
wavはLR&チャンネルのバウンダリさえ気をつければどっから再生しても問題無いけど、
mp3は[4バイトのヘッダ+データ]のブロック単位でシークする必要がある。
てかmp3使うならエンコード/デコードのライブラリが必要。
フリーで転がってるソースはエンコはgogo、デコードはmpg123辺りかなぁ。
281:277
06/10/28 18:54:05
>>280
どうも、ありがとうございます。
それほど複雑な処理を必要としないさそうで、ちょっと安心しました。
waveとmp3でやり方が大きく違いそうだということもわかりました。特にmp3は敷居が高そうですね。
とりあえずwaveでタイムシフトを実現させることを目指そうと思います。
こんなプログラムは探せばに既にあるんでしょうけど、勉強を兼ねて自分でやってみようと思います。
ありがとうございました。
282:デフォルトの名無しさん
06/11/02 18:55:56
ADPCMの詳しい資料ってありませんか?
283:デフォルトの名無しさん
06/11/02 20:40:10
CCITTの規格書とかお金出せば買えるよ
284:デフォルトの名無しさん
06/11/03 01:30:14
>> 282
何が知りたいの?
285:デフォルトの名無しさん
06/11/04 15:55:44
OpenALでサウンドプログラムを組んでみたいんだけど入門的なサイトって無いだろうか?
286:デフォルトの名無しさん
06/11/05 00:01:03
linuxでC言語使ってサウンドプログラミングやってます。
録音したデータにFFTをかけたいんですが、
データの渡し方が分かりません。
URLリンク(adlib.rsch.tuis.ac.jp)
録音は↑のプログラムをベースにしています。
どなたかアドバイスをお願いします。
説明不足だったらすみません。
287:デフォルトの名無しさん
06/11/05 00:14:45
>>286
> linuxでC言語使ってサウンドプログラミングやってます。
> 録音したデータにFFTをかけたいんですが、
> データの渡し方が分かりません。
ここで聞くような内容じゃないだろ。
プログラム初心者板にでも行った方が幸せになれる。
288:デフォルトの名無しさん
06/11/05 00:25:33
read したとき bufに指定のフォーマット、サイズで
データが納まってるのでそれを処理すればよい。
289:デフォルトの名無しさん
06/11/05 01:01:41
>>287
すいません。
>>288
ありがとうございます。
解決しました。
290:デフォルトの名無しさん
06/11/05 02:00:31
あるmp3のファイルの波形データをサンプリングするフリーソフトってありますか?
time WavAmp
1 1.235
2 -0.256
3 8.242
4 -0.319
…
みたいな感じで、テキストデータに保存できるソフトです
291:デフォルトの名無しさん
06/11/05 02:12:00
>>290
質問する板が違います
二度と来るな
292:デフォルトの名無しさん
06/11/05 02:13:06
またきちゃいました(>_<)
質問する板ってどこ?
293:デフォルトの名無しさん
06/11/05 02:41:50
>>292
自分で作ればこの板でおk
294:デフォルトの名無しさん
06/11/05 03:12:10
>>293
実は自分でもジャンルがよく分かってないんです。
フーリェ変換や波形分析するのはここのスレの人なのかなって
スレ一覧見て思ったので聞いてみたのです。
完全体セルの「笑えよベジータ」って声があるんだけど、それをフーリェ変換したら
どうなるのかなと思ったもので。
フーリェ変換のプログラムは持っているので、
あとは時間きざみごとの波形データが数値として取れれば…
295:デフォルトの名無しさん
06/11/05 03:18:53
>>294
wavか何かに変換すればいいんじゃね?
296:デフォルトの名無しさん
06/11/05 03:51:06
>>295
wavに変換すれば解析可能なソフトがあるってことですかね?
何しろ、サウンドプログラミングはズブの素人なのです。
確か、数秒のファイルでもwavにすると500KBくらいになりますよね。
プログラムのソースで500KBって結構なデータ量になります。
音楽データにどのような情報が入っているのかは分からないのですが、
ただ、欲しい情報は「波のきざみ幅」と「きざみ幅ごとの振幅」の
二つのデータなのです。
単純に波の振幅と刻幅を抽出するソフトがあれば紹介してもらいたいのです。
プログラム板一覧を見て、このスレの人なら知ってる人がいるのかなと思って質問しました。
297:デフォルトの名無しさん
06/11/05 03:59:53
ソフトウェア板辺りで質問スレ探すかLinux板で同系列のスレ探しなさい。
298:デフォルトの名無しさん
06/11/05 04:02:59
了解しますた。
299:デフォルトの名無しさん
06/11/05 19:18:27
フリーソフトを使う事をプログラミングだと思ってるのか
300:デフォルトの名無しさん
06/11/05 22:32:01
>>299
バイナリから直に数値データって取れんの?
301:デフォルトの名無しさん
06/11/05 22:59:31
>>300
普通に取れるけど、取れても取れなくても、
フリーソフトを使う事をプログラミングとは言わない。
302:デフォルトの名無しさん
06/11/06 12:40:47
>>301
普通ってどうやるの?
303:デフォルトの名無しさん
06/11/06 13:06:21
>>302
普通にバイナリファイルを読み込めばいい。
バイナリファイルの読み込み方はスレ違い。初心者スレにでも池。
音声ファイルのフォーマットが知りたければぐぐれ。
304:デフォルトの名無しさん
06/11/06 13:20:44
>>303
どの言語がお勧め?
305:デフォルトの名無しさん
06/11/06 13:45:23
>>304
日本語でおk
306:デフォルトの名無しさん
06/11/06 14:00:48
>>304-305
吹いたw
307:デフォルトの名無しさん
06/11/06 14:28:46
>>303
ほんとに知ってて言ってるのこの人?
308:デフォルトの名無しさん
06/11/06 14:39:36
>>294
ソフトを自分で作ってやるなら
1、とりあえずMP3ファイルを 16bitWAV形式に変換して保存しよう(ツールは探してね)
2、WAV形式のファイルをバイナリでオープンして、(RIFF+チャンク)で検索してデータを取り出そう
3、かけたいFFTのサイズ以下になるように窓関数をかける -->判らなければ検索してね
4、FFTをかける(ステレオなら2変数を複素FFTでやる方法を使うといいよ)
5、周波数成分毎に絶対値を出しそう
FFTは周波数は比例軸で出るので、大抵は対数軸にしたいと思うので、ココがまあキモになるね
309:デフォルトの名無しさん
06/11/06 14:51:08
で、たぶん >>294のやりたいのは
短時間FFTを使って ソノグラム表示もどきをやりたいのだと思う
310:デフォルトの名無しさん
06/11/06 15:12:33
>>309
短時間FFTはなにかまずい?
311:デフォルトの名無しさん
06/11/06 15:26:54
>>308
あ、ありがとうございます。
これで作業の方針をきめられそうです。
御迷惑お掛けしました。
ありがとうございました。
312:デフォルトの名無しさん
06/11/06 16:03:51
>>310
まずくはないよ。
等Qの特性で分割して表示したいとか言い出すと、短時間FFTだと逆にメンドクサイだけで
313:デフォルトの名無しさん
06/11/06 17:24:35
OpenALのプログラムを勉強したいのですが初心者にも参考になるサイトはありませんか?
環境はOSがWindows2000,IDEはVisualStudio2003です。
まだOpenALのSDKは入れていないのでそのあたりから解説してくれているサイトであると助かります。
314:デフォルトの名無しさん
06/11/06 17:26:21
ググレカス
315:デフォルトの名無しさん
06/11/06 17:31:40
オープンソースだからソース見ればいいよ
316:デフォルトの名無しさん
06/11/10 16:31:33
WindowsVISTAに移行することを考え、今までのDirectSoundベースで組んできた
プログラムを全てOpenALに以降することを考えています。そこでお聞きしたいのですが、
DirectSoundベースのプログラムはクライアントPCにDirectXがインストールされていれば
ハードウェアだろうかソフトウェアだろうが問題なく音を再生することが出来ました。
これがOpenALに移行するとクライアント側のPCには最低限何をインストールしておく
必要があるでしょうか?またクリエイティブのサウンドカード(EAXをサポートしたもの)、
その他のサウンドカード、オンボードサウンド、で違いというのは生じますか?
317:デフォルトの名無しさん
06/11/10 22:49:27
URLリンク(www.openal.org)
公式のメーリングリストで聞けば?
318:デフォルトの名無しさん
06/11/28 01:48:49
a.midとb.midを同時再生するプログラムを書きたいのですが、
変数を二つ用意しても、二つ目を再生するところで
「指定したMIDIデバイスは既に使用されています。開放されるのをまってください」
という警告が出てしまいます。
mmsystem.hを使う方法で解決策はないでしょうか。
319:デフォルトの名無しさん
06/11/28 02:11:07
>>318
MIDIデバイスを二つ用意したら?
320:デフォルトの名無しさん
06/11/28 02:16:24
>>319
MIDIデバイスを二つ用意とはどのようにすればよいのでしょうか?
ハード面でということですか?
環境としては、PCにMIDIインターフェースをつなぎMIDI音源で音を鳴らしてます。
321:デフォルトの名無しさん
06/11/28 03:51:29
>>320
まず環境を書け。
使ってる言語、OS、再生に使用してるライブラリ、最低このくらいは質問時に書いとけ。
それとデバイスの意味がわからないならそこから調べ直せ。
MIDIはWAVEと違って同一デバイスに複数ストリームを流せないから、
MIDIOUTが2ポートあるデバイスで、例えばSC88なりに別々に流すしかない。
322:デフォルトの名無しさん
06/11/30 23:47:20
実験音楽的に、二つのmidiをマージしたいって事では…?
323:デフォルトの名無しさん
06/12/01 00:35:28
まぁそれだったら流す前に自分でトラックをマージしちゃえばいいだけのことだけどね
324:デフォルトの名無しさん
06/12/13 02:15:53
windows系ですけど、
MM_WOM_DONEなどのメッセージ処理中はwaveOutWriteとか使えないって記述をたまに見るんですけど実際どうなんですか。
325:デフォルトの名無しさん
06/12/13 07:45:02
windows系といっても色々。
昔は割り込み=コールバックだったり
タスクスイッチされてなかったりと
326:324
06/12/14 03:35:29
とりあえず95以降。
95で大丈夫ならその後でも大丈夫な気がするんですけど。
327:デフォルトの名無しさん
06/12/14 10:05:40
>>326
95は2000やXPとは根本的に別モノ。
328:デフォルトの名無しさん
06/12/14 13:05:50
95, 98, Me は MS-DOS だと思った方がいいぞ。馬糞にホイップクリーム。
329:デフォルトの名無しさん
06/12/14 18:00:56
アルゴリズムの質問なんですがここでいいですかね?
オーディオストリームのピークホールド処理(過去nサンプル中の最大値を出力)を作っているのですが、
一番安直と思われる方法=過去nサンプルをバッファしといて毎フレームでバッファ内を全サーチ
という方法で作ったところ、ちょっと重いです。高速な方法はないでしょうか。
330:デフォルトの名無しさん
06/12/14 18:26:50
>>329
1.過去の最高値と今の値を比較し、今の値が高ければ最高値を更新し、カウンタを0に
2.カウンタをインクリメント
3.カウンタが一定値を超えたら、過去nサンプル中の最高値を検出し、カウンタをそこからの値に
ってやりかたはどう? nの値によっては比較回数が減るよ。
331:デフォルトの名無しさん
06/12/14 18:53:14
>>330
おー、なるほど、すばらしいです。
聞いてよかった。早速試してみますー
332:デフォルトの名無しさん
06/12/14 22:04:56
>>330
ご報告、
入力波形の傾向によっても負荷の具合が変動するってことになりますが
平均して初めの方法よりかなり速いです。まじありがとうございます。
333:デフォルトの名無しさん
06/12/14 23:09:33
>>330-332
それならば「最高値」を2つ持つようにすればどうだ?
それぞれA値・B値と呼ぶことにする。
1.A値と今の値を比較し、今の値が高ければA値を更新し、カウンタを0、B値を0に
2.カウンタをインクリメント
3.B値と今の値を比較し、今の値が高ければB値を更新、カウンタの値を記憶
4.カウンタが一定値を超えたら、記憶しておいた値に更新、A値にB値を代入し、B値を0に
334:デフォルトの名無しさん
06/12/14 23:10:48
すまん間違えた。
4. を修正
4.カウンタがnを超えたら、(n-記憶しておいた値)に更新、A値にB値を代入し、B値を0に
335:デフォルトの名無しさん
06/12/14 23:12:00
ん、なんか微妙に違うかもしれない。
ともかく、1位だけじゃなく2位も記憶しておけばいいんじゃないかってことだ。
336:デフォルトの名無しさん
06/12/14 23:54:00
>>333
試してみるまでもなくダメっぽいな・・・
337:329
06/12/15 00:04:49
1位の期限が切れたとき、途中で保存しておいた2位を新しい1位とするみたいな感じですよね?
実はじぶんもそうゆうの考えたんですがね、ややこしくてあきらめちゃったんですよね。
そう簡単にはいかなかったような・・・
これって一見とても単純な処理なのに、速いアルゴリズム考えようとすると、
思いのほかアレ?て感じゃありません?
だから330の即レスはけっこう目からうろこですた
338:デフォルトの名無しさん
06/12/15 01:17:37
2位なんているの?
ビデオのメーター見てても2秒毎にリセットしてるだけだよ。
339:デフォルトの名無しさん
06/12/15 02:15:13
本人が満足するのが一番の解でYO
340:329
06/12/15 02:17:36
メーターだったらそんな感じで十分なんでしょうけど、リミッター作ってるとこでして。
341:デフォルトの名無しさん
06/12/15 10:36:30
WAVデータのサンプリング変換って、どーやりますか?
例えば、11025で8ビットのものは、1バイトの音声データの羅列で、
22050で16ビットのものは、2バイトの音声データの羅列で、
22050は、11025の2倍だから、22050を11025にするには、
out[0] = in[1];
out[2] = in[5];
out[3] = in[9];
:
とやってくだけでOKだと思った。
が、音がザーザーです。
342:デフォルトの名無しさん
06/12/15 10:49:48
>>340
メーターだとこんなやり方もある。
あなろぐ VU メーターっぽい動き。リミッターにも使えるんじゃない?
過去のpeakを減衰させて現在値と比べる方法。
peak = peak * 0.999; // peak = max(peak-k, 0) でもなんでもいい。減衰するように。
peak = max( peak, current_sample);
343:デフォルトの名無しさん
06/12/15 10:52:44
>>341
8bit PCM は、ふつー符号無しデータで、0x00が負の最大、0x80が無音、
0xffが正の最大。
344:デフォルトの名無しさん
06/12/15 10:52:52
>>341
リサンプリング LPF とかでググってみて。
手を抜く場合には単純に out[0] = (in[0] + in[2]) / 2 とか。
345:デフォルトの名無しさん
06/12/15 12:30:44
>>343
いまく行きました。ありがとうございました。
>>344
2バイト値を1バイト値に変換する場合、単に上位バイトを格納すれば良いだけです。
これで、256で除算したことになります。
346:デフォルトの名無しさん
06/12/15 12:32:37
>>345
サンプリング周波数 22050Hz のデータから 11025Hz への変換かとオモタ
347:デフォルトの名無しさん
06/12/15 12:38:08
>>343
16bitPCMは符合有りなんだっけ?
348:デフォルトの名無しさん
06/12/15 12:52:55
22050Hz から 11025Hz にする場合、たんに間引けばいいだけじゃん?
平均取ると何か良くなる?
349:デフォルトの名無しさん
06/12/15 13:10:50
>>347
WAVのPCMに関しては、そう。
それ以外の文脈だと、符号有り8bitや符号無し16bitのPCMももちろん使
われることがある。
350:デフォルトの名無しさん
06/12/15 16:48:16
>348
それだとエイリアシングノイズ乗るでそ。
344のでも1/2以上のリサンプリングで乗るけど。
詳しくはFIRとかIIRとかで調べてみて。
351:デフォルトの名無しさん
06/12/15 17:18:03
>>348
サンプリングレート変換の時はLPFを通して先に高域をカットしなきゃダメ。
中途半端な周波数落としをするときはウェーブレットなんかで補間したほうがノイズが減る。
352:デフォルトの名無しさん
06/12/20 14:26:55
FIRフィルタ(ローパス/ハイパス)のインパルスを
カットオフ周波数をパラメタとしてリアルタイムで生成したいんですが、
どこかにcコードサンプルとかないでしょうかね?
数学を理解して自分で書くのは無理そうでして・・・
353:デフォルトの名無しさん
06/12/20 21:48:52
>>341
幾何学的な手法なら、三次曲線で補完とか、ガウシアンフィルタかける方法もあるぞ。
354:デフォルトの名無しさん
06/12/21 00:15:30
>>352
sinc関数 sinc(x)=sin(x)/(x) にあなたの好みの肩特性の窓関数をかけるだけ
だが、あなたの好みが判りません。
355:デフォルトの名無しさん
06/12/21 00:16:19
>>353
結局全て LPFなのさ
356:デフォルトの名無しさん
06/12/21 01:54:43
>>354
そんなにシンプルな感じなんですか?
でもすいません、sincだけでは意味がわからないです・・・
xはなんでしょう?どこでフィルターの種類やカットオフはどこで決まるのでしょう。
窓はhammingでよいかと思います。
357:デフォルトの名無しさん
06/12/21 07:05:28
判ったよ。手取り足取り教えてくれというわけだ。
sincは検索用のキーワード これで検索しろって意味だ
w:=2*π*f0/fs として
xが0でなければ sin( x * w) /x xが0の時 w
xを整数で±の窓関数の範囲で、窓関数を掛け算
で,ゲインがπあるから、それは除算するし、窓関数のゲイン分も掛け算すると
358:デフォルトの名無しさん
06/12/21 07:14:27
フィルターの種類は、実際に係数を設定してどんな特性になるか見てみりゃいいだろ
理想LPFと理想HPFは 足せばフラット = 1 になるから 中央値以外は符号が反転するだけだ
359:デフォルトの名無しさん
06/12/21 10:34:01
>>355
そうなんだけど、フーリエ変換しないでいいからとっつきやすいかな、と。
360:352
06/12/21 15:28:35
>>357-358
おしえていただいた内容と、徹夜でネットをしらべまくった結果、
数学はさておき、無事うまく動作するコードが書けました。
思ってたよりシンプルなコードになったので驚きです。
ハイパスはローパス用のインパルス応答の振幅が反転された形になるんですね。
プログラムが生成したインパルス応答からフィルタ特性を解析したところ、特性も良好でした。
どうもありがとうございました。
361:352
06/12/21 21:24:16
すいません、ハイパスについては間違えてたみたいですね・・・
362:デフォルトの名無しさん
06/12/21 23:33:28
サンプリングレートが44100/1secだとすると、この場合の1sec/44100の単位はなんて呼称すれば良いんでしょうか
363:デフォルトの名無しさん
06/12/21 23:55:15
1sec/44100 → (1/44100)秒
364:デフォルトの名無しさん
06/12/22 01:01:27
sec per samplingrate?
365:デフォルトの名無しさん
06/12/22 01:48:01
いちサンプル
366:デフォルトの名無しさん
06/12/22 03:34:30
sample per rate
367:デフォルトの名無しさん
06/12/22 07:19:21
>>361
もう判ったと思うけど 中央の係数のみ 1-a の関係になって、他の係数は負数にすればいいだけ
368:デフォルトの名無しさん
06/12/22 13:42:29
ASIO SDKのhostサンプルがシンプル過ぎるのもどうかと思う今日この頃。
やっと音が出た…orz
369:369
06/12/23 22:12:57
なんかディスクI/Oが少しでも集中すると再生が途切れる…。
やっぱりスレッド使って処理を分けないとダメか。
370:368
06/12/25 10:56:31
なんか適当にスレッド作って
読込処理を非同期にして
少し多くバッファリングしたら
飛ばなくなった。
出来たプログラムはwavの非圧縮PCMしか
再生できないけどなんだか嬉しい。
371:デフォルトの名無しさん
06/12/25 22:03:51
ゲームに関して何だけどPCにマイクを接続して喋ってるんだけど
EAXを使ったゲームを起動するととたんに俺のヴォイスにエコーが
かかるようになる。どうもそのPCゲームがEAXを使っているとそれに
つられてマイク入力の音声にもエコーみたいな効果が強制的に
かけられてしまうらしい。これって現状仕方がないことなん(´・ω・`)?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4933日前に更新/170 KB
担当:undef