1 名前:デフォルトの名無しさん [2006/04/21(金) 07:54:35 ] 音のプログラミング処理について語りましょう 各エフェクタの組み合わせとか、 プログラミング外の話題はDTM板の方がいいよ サウンドプログラミング2 pc8.2ch.net/test/read.cgi/tech/1091054082/ サウンドプログラミング pc5.2ch.net/test/read.cgi/tech/996171508/
303 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 13:06:21 ] >>302 普通にバイナリファイルを読み込めばいい。 バイナリファイルの読み込み方はスレ違い。初心者スレにでも池。 音声ファイルのフォーマットが知りたければぐぐれ。
304 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 13:20:44 ] >>303 どの言語がお勧め?
305 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 13:45:23 ] >>304 日本語でおk
306 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 14:00:48 ] >>304-305 吹いたw
307 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 14:28:46 ] >>303 ほんとに知ってて言ってるのこの人?
308 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 14:39:36 ] >>294 ソフトを自分で作ってやるなら 1、とりあえずMP3ファイルを 16bitWAV形式に変換して保存しよう(ツールは探してね) 2、WAV形式のファイルをバイナリでオープンして、(RIFF+チャンク)で検索してデータを取り出そう 3、かけたいFFTのサイズ以下になるように窓関数をかける -->判らなければ検索してね 4、FFTをかける(ステレオなら2変数を複素FFTでやる方法を使うといいよ) 5、周波数成分毎に絶対値を出しそう FFTは周波数は比例軸で出るので、大抵は対数軸にしたいと思うので、ココがまあキモになるね
309 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 14:51:08 ] で、たぶん >>294 のやりたいのは 短時間FFTを使って ソノグラム表示もどきをやりたいのだと思う
310 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 15:12:33 ] >>309 短時間FFTはなにかまずい?
311 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 15:26:54 ] >>308 あ、ありがとうございます。 これで作業の方針をきめられそうです。 御迷惑お掛けしました。 ありがとうございました。
312 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 16:03:51 ] >>310 まずくはないよ。 等Qの特性で分割して表示したいとか言い出すと、短時間FFTだと逆にメンドクサイだけで
313 名前:デフォルトの名無しさん [2006/11/06(月) 17:24:35 ] OpenALのプログラムを勉強したいのですが初心者にも参考になるサイトはありませんか? 環境はOSがWindows2000,IDEはVisualStudio2003です。 まだOpenALのSDKは入れていないのでそのあたりから解説してくれているサイトであると助かります。
314 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 17:26:21 ] ググレカス
315 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 17:31:40 ] オープンソースだからソース見ればいいよ
316 名前:デフォルトの名無しさん [2006/11/10(金) 16:31:33 ] WindowsVISTAに移行することを考え、今までのDirectSoundベースで組んできた プログラムを全てOpenALに以降することを考えています。そこでお聞きしたいのですが、 DirectSoundベースのプログラムはクライアントPCにDirectXがインストールされていれば ハードウェアだろうかソフトウェアだろうが問題なく音を再生することが出来ました。 これがOpenALに移行するとクライアント側のPCには最低限何をインストールしておく 必要があるでしょうか?またクリエイティブのサウンドカード(EAXをサポートしたもの)、 その他のサウンドカード、オンボードサウンド、で違いというのは生じますか?
317 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 22:49:27 ] www.openal.org/lists.html 公式のメーリングリストで聞けば?
318 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 01:48:49 ] a.midとb.midを同時再生するプログラムを書きたいのですが、 変数を二つ用意しても、二つ目を再生するところで 「指定したMIDIデバイスは既に使用されています。開放されるのをまってください」 という警告が出てしまいます。 mmsystem.hを使う方法で解決策はないでしょうか。
319 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:11:07 ] >>318 MIDIデバイスを二つ用意したら?
320 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:16:24 ] >>319 MIDIデバイスを二つ用意とはどのようにすればよいのでしょうか? ハード面でということですか? 環境としては、PCにMIDIインターフェースをつなぎMIDI音源で音を鳴らしてます。
321 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 03:51:29 ] >>320 まず環境を書け。 使ってる言語、OS、再生に使用してるライブラリ、最低このくらいは質問時に書いとけ。 それとデバイスの意味がわからないならそこから調べ直せ。 MIDIはWAVEと違って同一デバイスに複数ストリームを流せないから、 MIDIOUTが2ポートあるデバイスで、例えばSC88なりに別々に流すしかない。
322 名前:デフォルトの名無しさん mailto:sage [2006/11/30(木) 23:47:20 ] 実験音楽的に、二つのmidiをマージしたいって事では…?
323 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 00:35:28 ] まぁそれだったら流す前に自分でトラックをマージしちゃえばいいだけのことだけどね
324 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 02:15:53 ] windows系ですけど、 MM_WOM_DONEなどのメッセージ処理中はwaveOutWriteとか使えないって記述をたまに見るんですけど実際どうなんですか。
325 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 07:45:02 ] windows系といっても色々。 昔は割り込み=コールバックだったり タスクスイッチされてなかったりと
326 名前:324 mailto:sage [2006/12/14(木) 03:35:29 ] とりあえず95以降。 95で大丈夫ならその後でも大丈夫な気がするんですけど。
327 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 10:05:40 ] >>326 95は2000やXPとは根本的に別モノ。
328 名前:デフォルトの名無しさん [2006/12/14(木) 13:05:50 ] 95, 98, Me は MS-DOS だと思った方がいいぞ。馬糞にホイップクリーム。
329 名前:デフォルトの名無しさん [2006/12/14(木) 18:00:56 ] アルゴリズムの質問なんですがここでいいですかね? オーディオストリームのピークホールド処理(過去nサンプル中の最大値を出力)を作っているのですが、 一番安直と思われる方法=過去nサンプルをバッファしといて毎フレームでバッファ内を全サーチ という方法で作ったところ、ちょっと重いです。高速な方法はないでしょうか。
330 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 18:26:50 ] >>329 1.過去の最高値と今の値を比較し、今の値が高ければ最高値を更新し、カウンタを0に 2.カウンタをインクリメント 3.カウンタが一定値を超えたら、過去nサンプル中の最高値を検出し、カウンタをそこからの値に ってやりかたはどう? nの値によっては比較回数が減るよ。
331 名前:デフォルトの名無しさん [2006/12/14(木) 18:53:14 ] >>330 おー、なるほど、すばらしいです。 聞いてよかった。早速試してみますー
332 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 22:04:56 ] >>330 ご報告、 入力波形の傾向によっても負荷の具合が変動するってことになりますが 平均して初めの方法よりかなり速いです。まじありがとうございます。
333 名前:デフォルトの名無しさん [2006/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 名前:デフォルトの名無しさん [2006/12/14(木) 23:10:48 ] すまん間違えた。 4. を修正 4.カウンタがnを超えたら、(n-記憶しておいた値)に更新、A値にB値を代入し、B値を0に
335 名前:デフォルトの名無しさん [2006/12/14(木) 23:12:00 ] ん、なんか微妙に違うかもしれない。 ともかく、1位だけじゃなく2位も記憶しておけばいいんじゃないかってことだ。
336 名前:デフォルトの名無しさん [2006/12/14(木) 23:54:00 ] >>333 試してみるまでもなくダメっぽいな・・・
337 名前:329 mailto:sage [2006/12/15(金) 00:04:49 ] 1位の期限が切れたとき、途中で保存しておいた2位を新しい1位とするみたいな感じですよね? 実はじぶんもそうゆうの考えたんですがね、ややこしくてあきらめちゃったんですよね。 そう簡単にはいかなかったような・・・ これって一見とても単純な処理なのに、速いアルゴリズム考えようとすると、 思いのほかアレ?て感じゃありません? だから330の即レスはけっこう目からうろこですた
338 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 01:17:37 ] 2位なんているの? ビデオのメーター見てても2秒毎にリセットしてるだけだよ。
339 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 02:15:13 ] 本人が満足するのが一番の解でYO
340 名前:329 mailto:sage [2006/12/15(金) 02:17:36 ] メーターだったらそんな感じで十分なんでしょうけど、リミッター作ってるとこでして。
341 名前:デフォルトの名無しさん [2006/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 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:49:48 ] >>340 メーターだとこんなやり方もある。 あなろぐ VU メーターっぽい動き。リミッターにも使えるんじゃない? 過去のpeakを減衰させて現在値と比べる方法。 peak = peak * 0.999; // peak = max(peak-k, 0) でもなんでもいい。減衰するように。 peak = max( peak, current_sample);
343 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:52:44 ] >>341 8bit PCM は、ふつー符号無しデータで、0x00が負の最大、0x80が無音、 0xffが正の最大。
344 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:52:52 ] >>341 リサンプリング LPF とかでググってみて。 手を抜く場合には単純に out[0] = (in[0] + in[2]) / 2 とか。
345 名前:デフォルトの名無しさん [2006/12/15(金) 12:30:44 ] >>343 いまく行きました。ありがとうございました。 >>344 2バイト値を1バイト値に変換する場合、単に上位バイトを格納すれば良いだけです。 これで、256で除算したことになります。
346 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 12:32:37 ] >>345 サンプリング周波数 22050Hz のデータから 11025Hz への変換かとオモタ
347 名前:デフォルトの名無しさん [2006/12/15(金) 12:38:08 ] >>343 16bitPCMは符合有りなんだっけ?
348 名前:デフォルトの名無しさん [2006/12/15(金) 12:52:55 ] 22050Hz から 11025Hz にする場合、たんに間引けばいいだけじゃん? 平均取ると何か良くなる?
349 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:10:50 ] >>347 WAVのPCMに関しては、そう。 それ以外の文脈だと、符号有り8bitや符号無し16bitのPCMももちろん使 われることがある。
350 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 16:48:16 ] >348 それだとエイリアシングノイズ乗るでそ。 344のでも1/2以上のリサンプリングで乗るけど。 詳しくはFIRとかIIRとかで調べてみて。
351 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 17:18:03 ] >>348 サンプリングレート変換の時はLPFを通して先に高域をカットしなきゃダメ。 中途半端な周波数落としをするときはウェーブレットなんかで補間したほうがノイズが減る。
352 名前:デフォルトの名無しさん [2006/12/20(水) 14:26:55 ] FIRフィルタ(ローパス/ハイパス)のインパルスを カットオフ周波数をパラメタとしてリアルタイムで生成したいんですが、 どこかにcコードサンプルとかないでしょうかね? 数学を理解して自分で書くのは無理そうでして・・・
353 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 21:48:52 ] >>341 幾何学的な手法なら、三次曲線で補完とか、ガウシアンフィルタかける方法もあるぞ。
354 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 00:15:30 ] >>352 sinc関数 sinc(x)=sin(x)/(x) にあなたの好みの肩特性の窓関数をかけるだけ だが、あなたの好みが判りません。
355 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 00:16:19 ] >>353 結局全て LPFなのさ
356 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:54:43 ] >>354 そんなにシンプルな感じなんですか? でもすいません、sincだけでは意味がわからないです・・・ xはなんでしょう?どこでフィルターの種類やカットオフはどこで決まるのでしょう。 窓はhammingでよいかと思います。
357 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 07:05:28 ] 判ったよ。手取り足取り教えてくれというわけだ。 sincは検索用のキーワード これで検索しろって意味だ w:=2*π*f0/fs として xが0でなければ sin( x * w) /x xが0の時 w xを整数で±の窓関数の範囲で、窓関数を掛け算 で,ゲインがπあるから、それは除算するし、窓関数のゲイン分も掛け算すると
358 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 07:14:27 ] フィルターの種類は、実際に係数を設定してどんな特性になるか見てみりゃいいだろ 理想LPFと理想HPFは 足せばフラット = 1 になるから 中央値以外は符号が反転するだけだ
359 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 10:34:01 ] >>355 そうなんだけど、フーリエ変換しないでいいからとっつきやすいかな、と。
360 名前:352 mailto:sage [2006/12/21(木) 15:28:35 ] >>357-358 おしえていただいた内容と、徹夜でネットをしらべまくった結果、 数学はさておき、無事うまく動作するコードが書けました。 思ってたよりシンプルなコードになったので驚きです。 ハイパスはローパス用のインパルス応答の振幅が反転された形になるんですね。 プログラムが生成したインパルス応答からフィルタ特性を解析したところ、特性も良好でした。 どうもありがとうございました。
361 名前:352 mailto:sage [2006/12/21(木) 21:24:16 ] すいません、ハイパスについては間違えてたみたいですね・・・
362 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 23:33:28 ] サンプリングレートが44100/1secだとすると、この場合の1sec/44100の単位はなんて呼称すれば良いんでしょうか
363 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 23:55:15 ] 1sec/44100 → (1/44100)秒
364 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 01:01:27 ] sec per samplingrate?
365 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 01:48:01 ] いちサンプル
366 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 03:34:30 ] sample per rate
367 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 07:19:21 ] >>361 もう判ったと思うけど 中央の係数のみ 1-a の関係になって、他の係数は負数にすればいいだけ
368 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 13:42:29 ] ASIO SDKのhostサンプルがシンプル過ぎるのもどうかと思う今日この頃。 やっと音が出た…orz
369 名前:369 mailto:sage [2006/12/23(土) 22:12:57 ] なんかディスクI/Oが少しでも集中すると再生が途切れる…。 やっぱりスレッド使って処理を分けないとダメか。
370 名前:368 mailto:sage [2006/12/25(月) 10:56:31 ] なんか適当にスレッド作って 読込処理を非同期にして 少し多くバッファリングしたら 飛ばなくなった。 出来たプログラムはwavの非圧縮PCMしか 再生できないけどなんだか嬉しい。
371 名前:デフォルトの名無しさん [2006/12/25(月) 22:03:51 ] ゲームに関して何だけどPCにマイクを接続して喋ってるんだけど EAXを使ったゲームを起動するととたんに俺のヴォイスにエコーが かかるようになる。どうもそのPCゲームがEAXを使っているとそれに つられてマイク入力の音声にもエコーみたいな効果が強制的に かけられてしまうらしい。これって現状仕方がないことなん(´・ω・`)?
372 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 00:08:53 ] >>371 板違い。
373 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 02:36:50 ] >>372 ゲーム系のサウンドプログラムもこのスレの範疇かと。
374 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 05:49:50 ] サウンドプログラム? どこが? ゲームの設定かOSの設定だろ?
375 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 07:49:50 ] >>371 ゲーム作ってるの?
376 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 10:06:05 ] >>371 非サラウンド環境でEAXを使ったら、そらエコーがかかっただけみたいになるがな。
377 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 15:12:35 ] >>371 クリエイティブのサウンドカードだろ? 仕様だ。 市場を一社独占させるとどうなるかの好例だな。
378 名前: 【吉】 [2007/01/01(月) 03:43:35 ] あけおめ♪
379 名前:デフォルトの名無しさん mailto:sage [2007/01/01(月) 13:25:07 ] 黙れよ
380 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 20:06:07 ] …FFTで… いや、ごめん。 いいや……。(´・ω・`)
381 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 21:13:43 ] ぉぃぉぃ…
382 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 20:41:58 ] 低速フーリエ変換ってないの?
383 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 23:35:48 ] DFT?
384 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 00:14:21 ] 筆算
385 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 10:20:29 ] >>382 バタフライ演算をしなけりゃ低速だよ。
386 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 16:11:17 ] 普通にDFTでええんちゃう?
387 名前:デフォルトの名無しさん [2007/01/18(木) 21:42:16 ] >>6 >>13 >>17 /* Risa [りさ] alias 吉里吉里3 [kirikiri-3] stands for "Risa Is a Stagecraft Architecture" Copyright (C) 2000-2007 W.Dee <dee@kikyou.info> and contributors See details of license at "license.txt" */ /* Phase Vocoder (フェーズ ボコーダ ; 位相ボコーダ)の実装 参考資料: www.panix.com/~jens/pvoc-dolson.par Phase Vocoder のチュートリアル。「ミュージシャンにもわかるように」 書かれており、数学音痴フレンドリー。 www.dspdimension.com/ 無料(オープンソースではない)の Time Stretcher/Pitch Shifterの DIRACや、各種アルゴリズムの説明、 Pitch Shifter の説明的なソースコードなど。 soundlab.cs.princeton.edu/software/rt_pvc/ real-time phase vocoder analysis/synthesis library + visualization ソースあり。 */
388 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:56:25 ] WAVで16bitの場合はサンプルごとにshort型にいれてるんだけど、 24bitの場合はどうすんの? 32bitは各サンプルをfloatにぶち込めばOK?
389 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 00:31:38 ] longでええやん
390 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 07:11:45 ] パソコンで処理をする目的なら、入力が何bitだろうと64bit浮動小数点で処理するのが楽だろう ・・・・整数演算の方が早いというような事を言いたい人なら別だが
391 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 11:31:37 ] >>390 16bitはshortに入れているのに?
392 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 12:19:02 ] wavファイル(RIFFフォーマット)の話だろ? WAVE_FORMAT_PCM(=1)は整数の8bit,16bitしか定義されてないんじゃね?
393 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 13:29:51 ] しかしBitsPerSampleにはいくらでも入れられる 入れるだけなら自由だ
394 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 17:36:11 ] 本気で言ってるなら池沼。
395 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 00:41:30 ] 内部は64bit浮動小数点、外部とのやりとりは24bit整数、あたりが標準的?
396 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 04:09:13 ] >>395 全然。 例えばそこらのアプリの音声再生プラグインは、音質よりも軽くしたい場合が多いでしょ。
397 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 04:11:09 ] 逆に、音声処理で精度が欲しいってんなら、内部80bit浮動小数点が使える環境を利用するだろうしさ。
398 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:54:32 ] 複数のPCMを単一のPCMにミックスしたいんだけどどうすりゃいいのかわからない。
399 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 22:06:11 ] >>398 加算した後でレベル調整でもすればいいんじゃね?
400 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 23:50:53 ] レベル調整は先にやったほうが良くない?
401 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 07:55:27 ] PCMは8bitか16bitだから 32bit型に一度入れてから割り算すればいい たとえばA,B,Cを 30%:20%:20% でMIXする場合 int vrA=30; int vrB=20; int vrC=20; int total=vrA+vrB+vrC; int w= A*vrA+B*vrB+C*vrC; return w / total; }
402 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 13:09:25 ] >>399-401 みんなありがとう。 やっぱ足して割ればいいのか。
403 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 11:42:48 ] ステレオWavデータのPAN設定のやり方教えてくださ ぐぐったけど、どうも該当するものが発見できなかったんで